【问题标题】:WPF Keeping Images in MemoryWPF 将图像保存在内存中
【发布时间】:2015-11-02 17:39:17
【问题描述】:

我的 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}"/>

不是重复的 我已经确定BitmapImage 被保留并明确调用了GC.Collect,它什么也没做。问题不在于 GC。当我在代码中创建对象时,我也总是Freeze 我的BitmapImage 对象。这不是我第一次来。

【问题讨论】:

  • 显示加载(和处理)图像的代码
  • 感谢您给我猩红色的“D”,尽管这不是直接复制的。我想我会尝试另一个论坛。
  • 您正在使用一个名为“WPF Animated GIF”的开源库?
  • @GlenThomas,没有听到这些图片,但我正在其他地方使用它。
  • @ErnodeWeerd,我已经阅读了整篇文章。我根本不使用流。你建议我这样做吗?

标签: wpf memory-leaks


【解决方案1】:

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

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

ImageBehavior.SetAnimatedSource(img, image);

或者这个:

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

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

【讨论】:

  • 就是这样!谢谢你。我切换到 XamlAnimatedGif,现在 GC 再次收集它们。这是新库 (github.com/thomaslevesque/XamlAnimatedGif) 它的工作方式与原来的非常相似,但在内存方面效果更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多