WPF内存问题与图像

时间:2013-12-18 05:07:05

标签: c# wpf

我似乎有一些大的内存消耗问题。当我第一次加载包含gridview和observablecollection的wpf应用程序时,应用程序大约为10mb。

当我点击gridview中的某个项目时,它会打开另一个窗口,其中包含一个图像控件,该控件将传递一个base64字符串,然后我将其转换为BitmapImage

然后应用程序从10mb跳到大约123mb。原始图像大小为64k,但我存储的所有图像都是base64字符串,我将其转换回byte []然后转换为BitmapImage。 是的我的意思是这样做。

当我关闭窗口时,没有一个ram被释放。我甚至尝试过调用GC。

我使用以下代码将base64图像转换为

var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.StreamSource = new SIO.MemoryStream(imageBytes);
bitmapImage.EndInit();
return bitmapImage;

然后将其分配给Image.Source

2 个答案:

答案 0 :(得分:1)

下面是一些提示和猜测,但是如果您使用内存分析器,您将能够看到占用内存的内容。 (例如the CLR profiler also VS 2012 ad 2013 come in-built memory profile tools和其他商业广告:.NET Memory Profiling Tools


  • 为什么指定来自hereCacheOption BitmapCacheOption.None说:
  

不要创建内存存储。所有图像请求都由图像文件直接填充。

相反,您可以使用OnLoad

  

在加载时将整个映像缓存到内存中。所有图像数据请求都从内存存储器中填充。

我读到:如果您在许多位置显示图像,它们共享相同的底层内存。因此,如果您在多个地方展示相同的图像,那肯定是更可取的。

  • 在示例here的评论中找到了另一个提示:
  

要节省大量应用程序内存,请设置DecodePixelWidth或
       DecodePixelHeight将图像源的BitmapImage值设置为所需的值        渲染图像的高度和宽度。如果你不这样做,应用程序将        缓存图像,好像它被渲染为正常大小而不是正常        显示的大小。

  • 为什么使用base64字符串,为什么不使用二进制数据,即byte[]?你对每个字符串有多少个副本?

答案 1 :(得分:0)

同意BitMap不会释放它的内存(尝试并厌倦了内存泄漏)。 但试试这个link

阅读最后一条评论可能是此解决方法可能解决问题