2012-06-01 38 views
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(); 
} 
+0

此代碼需要很多評論。每個動作都做了什麼,你在哪裏複製/創建一個位圖,以及你在哪裏處理什麼元素和原因。是否存在真正的內存泄漏或者應用程序是否僅使用可用的內存? – CodingBarfield

+0

metod創建圖像,稍後以pdf格式顯示。問題是,每當我運行這個metod時,內存消耗會增加,甚至在我完成pdf之後,它不會釋放任何內存。 – kingRauk

+0

它可能是一個簡單的問題,像一個靜態列表保留對所有圖像的引用。嘗試並更改'全局'實現並檢查是否有方法來保持內存使用不變。調用GC.Collect()兩次應該清理所有內存使用情況。 (哦,並upvote有用的答案/評論) – CodingBarfield

回答

1

,你可以看到每次這個課程叫,你失去了500KB的記憶。我對您的問題的回答是:不要使用RenderTargetBitmap類多次

你甚至不能釋放已使用的RenderTargetBitmap內存。

如果您確實需要使用RenderTargetBitmap類,只需在代碼結尾處添加這些行即可。

 GC.Collect() 
     GC.WaitForPendingFinalizers() 
     GC.Collect()