我似乎有一些大的内存消耗问题。当我第一次加载包含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
答案 0 :(得分:1)
下面是一些提示和猜测,但是如果您使用内存分析器,您将能够看到占用内存的内容。 (例如the CLR profiler, also VS 2012 ad 2013 come in-built memory profile tools和其他商业广告:.NET Memory Profiling Tools)
CacheOption
BitmapCacheOption.None
说:不要创建内存存储。所有图像请求都由图像文件直接填充。
相反,您可以使用OnLoad
:
在加载时将整个映像缓存到内存中。所有图像数据请求都从内存存储器中填充。
我读到:如果您在许多位置显示图像,它们共享相同的底层内存。因此,如果您在多个地方展示相同的图像,那肯定是更可取的。
要节省大量应用程序内存,请设置DecodePixelWidth或
DecodePixelHeight将图像源的BitmapImage值设置为所需的值 渲染图像的高度和宽度。如果你不这样做,应用程序将 缓存图像,好像它被渲染为正常大小而不是正常 显示的大小。
byte[]
?你对每个字符串有多少个副本?答案 1 :(得分:0)
同意BitMap不会释放它的内存(尝试并厌倦了内存泄漏)。 但试试这个link
阅读最后一条评论可能是此解决方法可能解决问题