与多个图像一起使用System.Windows.Controls.Image时出现内存问题

时间:2019-05-08 14:16:05

标签: c# wpf image

我在窗口上有一个画布,在该画布中有图像。该图像是System.Windows.Controls.Image,因此它没有/不需要Dispose方法。

但是,当我将其Source设置为一个新的源时(我已经使用MemoryStream和BitmapSource对其进行了设置,两者都具有相同的效果),但其先前的Source并没有完全清除。即使我再次使用同一张图像,内存使用量也会上升。

加载足够的图像后,它将崩溃,并出现3GB左右的内存不足异常。不幸的是,这些都是很大的图像,因此只需要17个即可。

使用点内存,我可以看到“泄漏”位于非托管内存中,这意味着我缺少对Dispose()的调用,或者程序中仍在使用ImageSource,但我对此表示怀疑,它是一个局部变量,没有在任何地方通过引用传递。

我尝试过强制垃圾回收并冻结BitmapSource,但是两者都没有效果。

有没有一种方法可以强制它在加载下一个图像之前完全清理上一个图像?我想念什么吗?我误会了情况吗?

这里是显示内存使用情况图表的图像,它显示了在显示新图像时部分清理了该图像。垃圾收集是非强制的第1代收集,我担心有这么多垃圾收集。 memory usage graph

1 个答案:

答案 0 :(得分:0)

对此的解决方案是,在我为Image赋值的函数中,通过引用将我的图像传递进来。

编辑:事实并非如此,这是垃圾收集器太慢了。我实际上是通过调用使图像源为空的方法解决此问题的,然后调用垃圾回收器,然后执行了MessageBox.Show()以便在显示下一幅图像之前给GC足够的时间进行清理。

我希望有一个更好的方法。

Edit2:我找到了一种更好的方法。消息框起作用的原因是它以某种方式更新了UI,从而导致画布被清除。通过调用Canvas.UpdateLayout()

可以达到相同的结果