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); 

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

如果使用资源监视器监视 RenderTargetBitmap类的行为,则可以看到每次调用此类时,会丢失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(); 

这不是真正的内存泄漏,至少在我的经验中。 您会在任务管理器中看到内存使用量上升,但垃圾收集器应该在实际需要时进行处理(或者您可以自己调用GC.Collect()来查看这种情况)。 也就是说,如果您正在绘制形状,则DrawingContext / DrawingVisuals在WPF中并不理想。 你可以更好地使用矢量图形,你会有很多副作用,包括可扩展性,而不会看到这个内存使用问题。

在这里查看我对类似问题的回答: 程序需要太多内存