我正在使用 aRenderTargetBitmap
来呈现一组控件以生成 PDF。以下代码段是相关部分:
public Drawing.Image RenderPageBitmap()
{
RenderTargetBitmap bit = null;
Drawing.Bitmap bmp = null;
try
{
bit = new RenderTargetBitmap(ImageSource.PixelWidth, ImageSource.PixelHeight, 96, 96, PixelFormats.Pbgra32);
var viewBox = GetPageXaml(); //This method loads some prebuilt XAML from an embedded resource, setting the DataContext as needed.
var siz = new Size(bit.PixelWidth, bit.PixelHeight);
viewBox.Measure(siz);
viewBox.Arrange(new Rect(siz));
viewBox.UpdateLayout();
var draw = new DrawingVisual();
using (var graph = draw.RenderOpen())
graph.DrawRectangle(new BitmapCacheBrush(viewBox), null, new Rect(siz));
bit.Render(draw);
bit.Freeze();
bmp = new Drawing.Bitmap(bit.PixelWidth, bit.PixelHeight, Imaging.PixelFormat.Format32bppPArgb);
var data = bmp.LockBits(new Drawing.Rectangle(Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, Imaging.PixelFormat.Format32bppPArgb);
{
bit.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
}
bmp.UnlockBits(data);
return bmp;
}
catch (Exception)
{
bmp?.Dispose();
throw;
}
finally
{
bit?.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
即使在 StackOverflow 和其他论坛上关注其他答案(如清除位图和执行垃圾收集)似乎也无法解决问题。这段代码的每个循环都会泄漏约 100MB 的内存,这意味着我很快就达到了 32 位进程的约 2GB 限制。
泄漏似乎只发生在该RenderTargetBitmap.Render
方法上,即使DrawingContext.DrawRectangle
调用也不会显着增加内存使用量。
我能做些什么来解决这个问题吗?
这是通过 JetBrains 的 dotMemory 查看的内存使用情况快照。显然,.Net 堆已正确清除,但非托管内存继续增长。