首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF 3.5 RenderTargetBitmap内存hog

WPF 3.5 RenderTargetBitmap内存hog
EN

Stack Overflow用户
提问于 2012-06-01 09:07:55
回答 1查看 2K关注 0票数 1

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

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

RenderTargetBitmap.Render存在内存问题,这在3.5中是一个众所周知的问题。

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

Program takes too much memory和更多..。

不管怎么说,有没有更多的想法来解决它.

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2014-07-21 20:57:03

如果使用RenderTargetBitmap资源监视器( Resource )监视类的行为,则可以看到每次调用该类时,都会丢失500 if的内存。我对你的问题的回答是:不要多次使用RenderTargetBitmap

您甚至不能释放使用过的RenderTargetBitmap内存。

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

代码语言:javascript
复制
        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10847454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档