2012-12-29 36 views
2

我目前使用窗體上的繪畫事件將圖像繪製到屏幕上。 (想象一下背景圖像)以及該圖像頂部的一些矩形。PaintEvent內存泄漏

private void MainWindow_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.Clear(Color.CornflowerBlue); 
    e.Graphics.DrawImage(Image.FromFile(m_Directory + @"\Images\" + BackgroundText), m_Screen); 
    e.Graphics.FillRectangle(BGBrush, new Rectangle(X, Y, Width, Height)); 
    e.Graphics.DrawString(Text, Settings.TextFont, Other.Settings.TextBrush, new Rectangle(X, Y + 2, Width, Height)); 
} 

頁面被重新粉刷經常(幾乎每個鼠標移動事件),並導致大量內存使用。在停止繪製到表單之前達到1,500,000k,並在圖片上顯示帶紅色十字的白色背景以顯示失敗的繪圖。

我對如何嚴重失控感到輕微的損失。我是新來繪畫與繪畫事件,所以任何幫助將不勝感激!

+4

嘗試在程序的另一部分而不是繪製事件中創建圖像。 Gobj在哪裏創建,它看起來像一個圖形對象。爲什麼不改用PaintEventArgs Graphics對象。 –

+0

對不起,Gobj來自e.graphics,但它被傳遞到另一個函數。原始評論現在使用普通的e.graphics顯示它。我會盡量讓圖片在另一部分表示感謝!如果有效,稍後會回覆! – DStow

+0

我之所以問Graphics對象,是因爲如果你創建一個,你應該確保自己和鋼筆以及其他類似的對象一起處理它。 –

回答

1

ImageIDisposable,所以您應該在「使用」塊中執行DrawImage調用,以確保處理圖像。

但最重要的是,我會重新考慮在Paint事件中執行繁重的IO操作。可能會提前加載圖像,以使Paint事件只擔心繪圖。您目前正在載入相同圖像數百次。

0

我認爲,如果你的UI線程正在不斷使用,終結器將被阻止。這些對象可能是垃圾回收,但可處理對象將被添加到終結器隊列中。終結器運行在UI線程中,所以如果你的UI線程忙,處理不會被調用。圖形對象通常包裝一個非託管對象,並且該對象需要使用dispose()進行清理。

當您完成繪畫時,我會手動處理所有圖形相關的對象。