RenderTargetBitmap
を使用して、PDFを生成するための一連のコントロールをレンダリングしています。RenderTargetBitmapのメモリリーク
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のメモリをリークする可能性があります。つまり、私はすぐに〜2GBの32ビットプロセス制限に達します。
RenderTargetBitmap.Render
メソッドでリークが排他的に発生しているとしても、DrawingContext.DrawRectangle
呼び出しでもメモリ使用量は大幅に増加しません。
この問題を解決する方法はありますか?
ここでは、JetBrainsのdotMemoryから見たメモリ使用量のスナップショットを示します。明らかに.Netヒープは正しくクリアされますが、アンマネージメモリは増加し続けます。私の検査に基づいて
@Downvoter、説明してください。 –
メモリリークがあると仮定しているのですか、本当にOutOfMemoryExceptionを打つのですか?私は私の答えを更新しました。ところで、私は投票しませんでした。 – CharithJ
メモリリークのあるRenderTargetBitmapがどのようになっているのですか? viewBox要素はどうですか?この質問をする前に必ずメモリプロファイラを使用してください。 – Clemens