WPF 将图像保存在内存中

标签 wpf memory-leaks

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

enter image description here

这是我如何公开 BitmapImage 然后绑定(bind)到 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。当我在代码中创建我的 BitmapImage 对象时,我也总是Freeze它们。这不是我第一次来这里。

最佳答案

我可以从对象图中看到您有一个名为 ImageAnimationController 的类,它通过 DependencyPropertyDescriptor 保存对使用 BitmapImage 作为其源的图像控件的引用>。 ImageAnimationController 使用 DependencyPropertyDescriptor 订阅 Image 控件的 Source DependencyProperty 的更改通知>。当 ImageAnimationController 类被释放时,它将取消订阅 DependencyPropertyDescriptor 通知。

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

ImageBehavior.SetAnimatedSource(img, image);

或者这个:

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

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

关于WPF 将图像保存在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925794/

相关文章:

WPF 无法使 ItemContainerGenerator.ContainerFromItem 工作

Java + JavaFX : does it make sense to periodically clear a ListView content on the long run?

Android Admob 4.1.1 有内存泄漏(见附件测试项目)。原因/修复/变通?

ios - 滚动 UICollectionView 使用大量内存导致崩溃

c# - Windows Phone 8 LongListSelector 内的图像内存泄漏

c# - WPF UI 线程被大集合阻塞

c# - WPF 的 DI 工厂

c# - 可观察模型中的 IEnumerable

wpf - 来自 Base64 的图像不会显示在 WPF 数据网格行中

java - 如何解决 GWT 中的内存泄漏?