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