1
我有一個使用了RenderTargetBitmap的3.5 WPF應用程序。WPF 3.5 RenderTargetBitmap內存豬
它像一隻大熊吃的記憶。
這是在3.5中的一個知道的問題,RenderTargetBitmap.Render有內存問題。
已找到一些解決方案,但我does not幫助。 https://connect.microsoft.com/VisualStudio/feedback/details/489723/rendertargetbitmap-render-method-causes-a-memory-leak
Program takes too much memory 更多...
反正不會有什麼更多的想法來解決它......
如果您監視使用 資源監視器的RenderTargetBitmap
類的行爲
static Image Method(FrameworkElement e, int width, int height)
{
const int dpi = 192;
e.Width = width;
e.Height = height;
e.Arrange(new Rect(0, 0, width, height));
e.UpdateLayout();
if(element is Graph)
(element as Graph).UpdateComponents();
var bitmap = new RenderTargetBitmap((int)(width*dpi/96.0),
(int)(height*dpi/96.0),
dpi,
dpi,
PixelFormats.Pbgra32);
bitmap.Render(element);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var stream = new MemoryStream())
{
encoder.Save(stream);
element.Clip = null;
Dispose(element);
bitmap.Freeze();
DisposeRender(bitmap);
bitmap.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
return System.Drawing.Image.FromStream(stream);
}
}
public static void Dispose(FrameworkElement element)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
public static void DisposeRender(RenderTargetBitmap bitmap)
{
if (bitmap != null) bitmap.Clear();
bitmap = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
此代碼需要很多評論。每個動作都做了什麼,你在哪裏複製/創建一個位圖,以及你在哪裏處理什麼元素和原因。是否存在真正的內存泄漏或者應用程序是否僅使用可用的內存? – CodingBarfield
metod創建圖像,稍後以pdf格式顯示。問題是,每當我運行這個metod時,內存消耗會增加,甚至在我完成pdf之後,它不會釋放任何內存。 – kingRauk
它可能是一個簡單的問題,像一個靜態列表保留對所有圖像的引用。嘗試並更改'全局'實現並檢查是否有方法來保持內存使用不變。調用GC.Collect()兩次應該清理所有內存使用情況。 (哦,並upvote有用的答案/評論) – CodingBarfield