0

RenderTargetBitmapPDFを生成するために一連のコントロールをレンダリングするためにを使用しています。次のコード セグメントは、関連するセクションです。

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 ヒープは正しくクリアされていますが、アンマネージ メモリは増え続けています。

メモリのスナップショット

4

2 に答える 2