WPF将图像保存在内存中

时间:2015-08-10 17:36:44

标签: wpf memory-leaks

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

enter image description here

以下是我如何公开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}"/>

NOT A DUPLICATE 我已经确定BitmapImage被保留并明确调用了GC.Collect,但没有做任何事情。问题不在于GC。当我在代码中创建它们时,我也总是Freeze我的BitmapImage个对象。这不是我的第一次。

1 个答案:

答案 0 :(得分:1)

我可以从对象图中看到你有一个名为ImageAnimationController的类,它持有一个Image控件的引用,该控件使用你的BitmapImage作为DependencyPropertyDescriptor的源。 ImageAnimationController使用DependencyPropertyDescriptor订阅更改Image控件Source DependencyProperty的通知。处理ImageAnimationController课程后,它将取消订阅DependencyPropertyDescriptor通知。

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

ImageBehavior.SetAnimatedSource(img, image);

或者这个:

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

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