1

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

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

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

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

程序占用太多内存 还有更多...

有没有更多的想法来解决它......

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();
}
4

1 回答 1

1

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

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

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

        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()
于 2014-07-21T20:57:03.957 回答