Wpf .net4中的静态内存泄漏-将内存BitmapImage绑定到映像源
我知道过去这里也有人问过类似的问题,但他们都没有解决我的问题的办法: 我将图像从内存加载到位图图像中:Wpf .net4中的静态内存泄漏-将内存BitmapImage绑定到映像源,wpf,memory-leaks,bitmapimage,imagesource,Wpf,Memory Leaks,Bitmapimage,Imagesource,我知道过去这里也有人问过类似的问题,但他们都没有解决我的问题的办法: 我将图像从内存加载到位图图像中: private static BitmapImage LoadImage(byte[] imageData) { if (imageData == null || imageData.Length == 0) return null; var image = new BitmapImage(); using (var mem =
private static BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
然后使用它(与INotifyPropertyChange一起)将生成的位图图像绑定到图像对象的源(在页面上)
问题是:这会泄漏内存(在我的例子中,2-3个图像上的内存高达300MB!)
您甚至没有使用探查器发现这一点-只有.net内存探查器让我走上了正轨(因为它在非托管内存中,所有字节都在那里-所以ANTS告诉我,.net使用分配给应用程序的总私有字节数为367,3MB的19,24MB”-很好):
不管我怎么做,我都不会让这个漏洞消失。
已尝试(一次全部尝试):
- 清除可视树/卸载时删除图像
- 将图像源设置为空
- 在矩形中使用ImageBrush而不是图像
- 不处理MemoryStream的其他缓存选项
- 不要冻结图像
看起来这根本不是bug(见我的第二条评论)-我必须检查一下,所以我现在就开始提问-也许这也能帮助解决其他问题对不起,伙计们-这确实不是“bug”,而是由高分辨率图片引起的
如果我应该删除这个问题,或者我应该把它留在这里,因为其他人可能会遇到同样的情况,请对此发表评论…hmm。。。不知道这是否真的是内存泄漏,因为“泄漏”似乎限制在550MB左右-在此之后,如果我再次加载位图,一些(200-300MB)内存将被释放-但这仍然不是一个令人满意的行为…嗯。。。哦,天哪,似乎这个问题是由愚蠢的图片使用引起的。这些图片是由用户提供的(一些类型的地图-黑色/白色和大量的白色),我只查看了文件大小(大约1MB)-但是那些是.JPG,图片的分辨率高达10000 X 5000像素(sic!)-所以将其解压为32位,很容易得到每张图片>150MB。。。所以我想我可以称之为“已解决”,但我现在就让它打开-也许有一些好的评论,我仍然需要尝试“解决方法”(=合理的图片)