我的WPF UI保留了我在内存中使用的所有图像。以下是相关的保留图。使用ANTS Memory Profiler 8.7,我已经确定我的代码都没有保留在任何这些对象上。我已编写代码,以便对同一图像的多个请求只创建一个图像,但这使我遇到的问题是,当应用程序全部同时加载时,我的应用程序中有足够的图像会使其崩溃。我在运行此内存配置文件时关闭了此代码。我需要刷新这些图像。我甚至使用手动调用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}"/>
NOT A DUPLICATE
我已经确定BitmapImage
被保留并明确调用了GC.Collect
,但没有做任何事情。问题不在于GC。当我在代码中创建它们时,我也总是Freeze
我的BitmapImage
个对象。这不是我的第一次。
答案 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}" />
我不熟悉这个库或您的代码,但我想您需要确保正确分离和处理此附加行为。