在Listbox中处理WPF中的图像(内存泄漏)

Kri*_*son 5 c# wpf memory-management

我有一个ListBox,里面有一堆图像(通过datatemplate完成).通过设置项目来源创建图像:

<Image x:Name="ItemImage" Source="{Binding ImageUrl}"/> 
Run Code Online (Sandbox Code Playgroud)

然后使用列表框的Items.Clear()方法清除它们.使用列表框的Items.Add方法添加新图像.

但是,内存使用量开始上升和上升.它显示的是相同的300个左右的小图像,但内存似乎永远不会被释放.该应用程序开始使用大约40Megs,并迅速攀升至700Megs.如何释放所有这些图像正在使用的内存?

编辑:有一件事我忘了提到,图像(大小各约4-5k)正在通过网络加载.缓存是否以某种方式对此负责?显示12个图像可以咀嚼大约10兆内存,大约是100X文件大小.

Isa*_*avo 4

除非您在加载图像时做了任何不寻常的事情(例如使用自制的图像加载器或其他东西),否则当没有任何东西再引用它们时,GC 应该为您清除它们。

您是否保留对任何地方的数据的引用?请记住,事件和事件处理程序有时会“欺骗”垃圾收集器,使其认为对象仍在使用中:

MyObject obj = new MyObject();
obj.TheEvent += new EventHandler(MyHandler);
obj = null;
// Now you might think that obj is set for collection but it 
// (probably - I don't have access to MS' .NET source code) isn't 
// since we're still listening to events from it.
Run Code Online (Sandbox Code Playgroud)

不确定这是否适用于你,但至少我会检查一下我是否是你。

另外,如果您有权访问分析器(例如 AQTime 或类似工具),那么通过它运行代码可能会给您一些提示。

您还可以尝试看看从磁盘或嵌入到程序集中的资源加载图像是否有任何区别。