2011-07-15 34 views
4

我想尽我创建RenderTargetBitmap一个实例来呈现图像的存储时间增加渲染图像与RenderTargetBitmap 和我做当记忆从未发布 ,这是代码:RenderTargetBitmap内存泄漏

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
               (int)(renderHeight * dpiY/96.0), 
               dpiX, 
               dpiY, 
               PixelFormats.Pbgra32); 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext ctx = dv.RenderOpen()) 
    { 
     VisualBrush vb = new VisualBrush(target); 
     ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
    } 
    rtb.Render(dv); 

请我需要帮助 我如何释放内存 并感谢所有人。

回答

0

这不是一个真正的内存泄漏,至少在我的经验。你会在任务管理器中看到内存使用情况,但是垃圾收集器在实际需要时应该照顾它(或者你可以自己调用GC.Collect()来看看发生了什么)。也就是说,如果你正在绘制图形,DrawingContext/DrawingVisuals在WPF中并不理想。使用矢量图形会更好,并且您可以获得许多附带优势,包括可伸缩性并且不会看到此内存使用问题。

见我的答案在这里一个类似的问题:Program takes too much memory如果您监视使用资源监视器RenderTargetBitmap类的行为

+1

感谢你,但这是错误的 我试图GC.Collect的(),并等待释放内存,但它从来没有发布 –

+0

穆罕默德,是它可能你在非UI线程上执行此操作?如果是这样,这可能是相关的:https://connect.microsoft.com/VisualStudio/feedback/details/648683/memory-leak-in-wpf-of-dispatcher-and-mediacontext-objects-resulting-in-win32exceptions – JacobJ

3

,你可以看到每个这个类叫,你失去了你的记忆500KB时间。我对您的问题的回答是:不要多次使用RenderTargetBitmap

您不能使用RenderTargetBitmap的已用内存。

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

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

这可能会解决你的问题:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
                (int)(renderHeight * dpiY/96.0), 
                dpiX, 
                dpiY, 
                PixelFormats.Pbgra32); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext ctx = dv.RenderOpen()) 
     { 
      VisualBrush vb = new VisualBrush(target); 
      ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
     } 
     rtb.Render(dv); 

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