RenderTargetBitmap
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 や他のフォーラム (ビットマップのクリアやガベージ コレクションの実行など) で他の回答を実行しても、問題は解決しないようです。このコードのループごとに最大 100 MB のメモリ リークが発生する可能性があるため、32 ビット プロセスの最大 2 GB の制限にすぐに達してしまいます。
呼び出しがメモリ使用量を著しく増加させなくても、リークはRenderTargetBitmap.Render
メソッドだけで発生しているようです。DrawingContext.DrawRectangle
この問題を解決するためにできることはありますか?
これは、JetBrains の dotMemory から見たメモリ使用量のスナップショットです。明らかに、.Net ヒープは正しくクリアされていますが、アンマネージ メモリは増え続けています。