我正面临内存泄漏问题。泄漏来自这里:

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/

10-12 04:52