【问题标题】:WPF 3.5 RenderTargetBitmap memory hogWPF 3.5 RenderTargetBitmap 内存占用
【发布时间】:2012-06-06 12:40:23
【问题描述】:

我有一个使用 RenderTargetBitmap 的 3.5 WPF 应用程序。

它像一只大熊一样吃掉记忆。

RenderTargetBitmap.Render 存在内存问题是 3.5 中的已知问题。

已经找到了一些解决方案,但我没有帮助。 https://connect.microsoft.com/VisualStudio/feedback/details/489723/rendertargetbitmap-render-method-causes-a-memory-leak

Program takes too much memory 还有更多...

还有什么办法可以解决吗...

static Image Method(FrameworkElement e, int width, int height)
{
    const int dpi = 192;

    e.Width = width;
    e.Height = height;

    e.Arrange(new Rect(0, 0, width, height));
    e.UpdateLayout();

    if(element is Graph)
        (element as Graph).UpdateComponents();

    var bitmap = new RenderTargetBitmap((int)(width*dpi/96.0),
                                                     (int)(height*dpi/96.0),
                                                     dpi,
                                                     dpi,
                                                     PixelFormats.Pbgra32);

    bitmap.Render(element);

    var encoder = new PngBitmapEncoder();

    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        element.Clip = null;
        Dispose(element);
        bitmap.Freeze();

        DisposeRender(bitmap);
        bitmap.Clear();

        GC.Collect();
        GC.WaitForPendingFinalizers();
        return System.Drawing.Image.FromStream(stream);

    }
}

public static void Dispose(FrameworkElement element)
{
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
}

public static void DisposeRender(RenderTargetBitmap bitmap)
{
        if (bitmap != null) bitmap.Clear();
        bitmap = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
}

【问题讨论】:

  • 这段代码需要大量注释。每个动作做什么,你在哪里复制/创建一个位图,你在哪里配置什么元素以及为什么。是否存在真正的内存泄漏,或者应用程序是否只是使用可用的任何东西?
  • 该方法创建的图像稍后会以 pdf 格式显示。问题是,每次我运行这个方法时,内存消耗都会增加,即使我完成了 pdf,它也不会释放任何内存。
  • 这可能是一个简单的问题,例如保留对所有图像的引用的静态列表。尝试更改“全局”实现,并检查是否有办法保持内存使用量不变。调用 GC.Collect() 两次应该清理所有内存使用。 (哦,赞成有帮助的答案/cmets)
  • @kingRauk 你能否澄清这句话:It is a known problem in 3.5?我在哪里可以找到这方面的参考资料?
  • 我的意思是 RenderTargetBitmap.Render 在 3.5 中存在内存泄漏问题。 connect.microsoft.com/VisualStudio/feedback/details/489723/…

标签: c# wpf memory .net-3.5


【解决方案1】:

如果您使用 Resource Monitor 监控 RenderTargetBitmap 类的行为,您可以看到每次调用该类时,您会损失 500KB 的内存。我对您的问题的回答是:不要多次使用RenderTargetBitmap

你甚至不能释放 RenderTargetBitmap 的已用内存。

如果您确实需要使用RenderTargetBitmap 类,只需在代码末尾添加这些行。

        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2011-10-06
    • 1970-01-01
    • 2017-10-14
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多