我正面临内存泄漏问题。泄漏来自这里:
public static BitmapSource BitmapImageFromFile(string filepath)
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad; //here
bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache; //and here
bi.UriSource = new Uri(filepath, UriKind.RelativeOrAbsolute);
bi.EndInit();
return bi;
}
我有一个
ScatterViewItem
,其中包含一个 Image
,源代码是这个函数的 BitmapImage
。实际情况比这复杂得多,所以我不能简单地将图像放入其中。我也不能使用默认加载选项,因为图像文件可能会被删除,因此在删除过程中访问该文件将面临一些权限问题。
当我关闭
ScatterViewItem
时会出现问题,这又关闭了 Image
。但是,缓存的内存不会被清除。所以经过多次循环,内存消耗相当大。我尝试在
image.Source=null
函数期间设置 Unloaded
,但它没有清除它。如何在卸载过程中正确清除内存?
最佳答案
我找到了答案 here 。似乎这是 WPF 中的一个错误。
我修改了函数以包含 Freeze
:
public static BitmapSource BitmapImageFromFile(string filepath)
{
var bi = new BitmapImage();
using (var fs = new FileStream(filepath, FileMode.Open))
{
bi.BeginInit();
bi.StreamSource = fs;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.EndInit();
}
bi.Freeze(); //Important to freeze it, otherwise it will still have minor leaks
return bi;
}
我还创建了自己的 Close 函数,该函数将在我关闭
ScatterViewItem
之前调用:public void Close()
{
myImage.Source = null;
UpdateLayout();
GC.Collect();
}
由于
myImage
托管在 ScatterViewItem
中,因此必须在关闭父级之前调用 GC.Collect()
。否则,它仍然会留在内存中。关于c# - 如何处理 BitmapImage 缓存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28364439/