我正在使用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的內存,這意味着我很快就會達到32位進程的〜2GB限制。
泄漏似乎只發生在RenderTargetBitmap.Render
方法上,即使調用DrawingContext.DrawRectangle
也不會明顯增加內存使用量。
我能做些什麼來解決這個問題嗎?
下面是通過JetBrains的dotMemory查看的內存使用情況的快照。顯然,.NET堆被正確清除,但非託管內存繼續增長。
@Downvoter,小心解釋一下? –
您是否假設存在內存泄漏或者您確實遇到了OutOfMemoryException?我已經更新了我的答案。順便說一句,我沒有投票。 – CharithJ
你怎麼知道它是有內存泄漏的RenderTargetBitmap? viewBox元素如何?在問這個問題之前,你一定要使用內存分析器。 – Clemens