WPF 将图像保存在内存中

WPF Keeping Images in Memory

我的 WPF UI 将我使用的所有图像保存在内存中。下面是相关的保留图。使用 ANTS Memory Profiler 8.7,我已经确定我的代码 none 持有这些对象。我已经编写了代码,以便对同一图像的多个请求只创建一个图像,但这给我留下了一个问题,即我的应用程序中有足够多的图像,当它们同时加载时会崩溃。当我 运行 这个内存配置文件时,我关闭了这个代码。我需要刷新这些图像。我什至诉诸于手动调用 GC.Collect ,这并没有减少使用的内存。有东西拿着这些图像,这不是我的代码。

这是我如何公开 BitmapImage 然后绑定到 Image.Source 的代码。这不包含我现在关闭的图像到路径字典缓存服务。

public BitmapImage Image
{
    get 
    {
        var image = new BitmapImage();
        image.BeginInit();
        image.UriSource = a_url;
        image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        image.EndInit();
        image.Freeze();

        return image;
    }
}

// The XAML
<Image Source="{Binding Image, Mode=OneWay}"/>

不是重复的 我已经确定 BitmapImage 被保留并明确调用了 GC.Collect 什么也没做。问题不在于 GC。当我在代码中创建它们时,我也总是 Freeze 我的 BitmapImage 对象。这不是我第一次来。

我可以从对象图中看到您有一个名为 ImageAnimationController 的 class,它通过 [=13= 持有对使用您的 BitmapImage 作为其源的图像控件的引用]. ImageAnimationController 使用 DependencyPropertyDescriptor 订阅 Image 控件的 Source DependencyProperty 的更改通知。 ImageAnimationController class 处理后,它将取消订阅 DependencyPropertyDescriptor 通知。

看起来这个 ImageAnimationController class 是名为 WPF Animated GIF 的开源库的一个组件。我看不到你是如何使用这个库的,因为你没有包含源代码,但我想你在某个地方有这样的东西:

ImageBehavior.SetAnimatedSource(img, image);

或者这样:

<Image gif:ImageBehavior.AnimatedSource="{Binding Image}" />

我不熟悉这个库或您的代码,但我想您将需要确保正确分离和处理此附加行为。