我好像有很大的内存消耗问题。当我第一次加载我的wpf应用程序时,它包含一个网格视图和一个观察集,应用程序大约是10 my。
单击网格视图中的项时,它将打开另一个窗口,该窗口包含图像控件,该控件将传递一个base64字符串,然后将该字符串转换为BitmapImage。
然后,应用程序从10 to跳到大约123 to。原始图像大小为64k,但我存储的所有图像都是base64字符串,我将这些字符串转换回byte[],然后转换为BitmapImage。是的我是想这么做的。
当我关闭窗口时,所有的公羊都得不到释放。我甚至打过电话给GC。
我使用下面的代码将base64映像转换为
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.StreamSource = new SIO.MemoryStream(imageBytes);
bitmapImage.EndInit();
return bitmapImage;
然后将其分配给Image.Source
发布于 2013-12-18 05:23:27
下面是一些提示和猜测,但是如果您使用内存分析器,您将能够看到占用内存的是什么。(例如CLR剖析器、同样VS 2012广告2013内置内存配置文件工具和其他商业产品:.NET内存分析工具)
CacheOption
BitmapCacheOption.None
中指定这里:不要创建内存存储。所有对图像的请求都由图像文件直接填充。
相反,您可以使用OnLoad
在加载时将整个图像缓存到内存中。所有对图像数据的请求都是从内存存储中填充的。
我读到:如果您在许多位置显示图像,它们共享相同的底层内存。因此,如果您在多个地方显示相同的图像,那当然更好。
若要保存重要的应用程序内存,请设置DecodePixelWidth或 将图像源的DecodePixelHeight值设置为所需的图像的高度和宽度。如果不这样做,应用程序将缓存图像,就像它被呈现为它的正常大小一样,而不是仅仅显示它的大小。
byte[]
s?每个字符串的引用有多少副本?发布于 2013-12-18 07:42:18
同意BitMap没有发布它的记忆(尝试和厌倦了记忆泄漏)。然而,尝试这个链接
阅读最后的评论可能是这样解决问题的解决办法。
https://stackoverflow.com/questions/20650055
复制相似问题