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}" />
我不熟悉这个库或您的代码,但我想您将需要确保正确分离和处理此附加行为。
我的 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}" />
我不熟悉这个库或您的代码,但我想您将需要确保正确分离和处理此附加行为。