2011-09-08 49 views
0

我們遇到了一些似乎與.NET運行時相關的圖形問題。偶爾,我們的應用程序中所有GroupBox的邊框和所有NumericUpDowns的箭頭消失。看起來他們因爲某種原因停止了重新繪製,因爲NumericUpDowns有時會在箭頭應該出現的地方出現圖形垃圾。GroupBoxes和NumericUpDowns的.NET圖形問題

我們懷疑多次重新啓動應用程序後發生錯誤。一旦問題出現,重新啓動應用程序將無濟於事。但是關閉所有.NET進程並重新啓動應用程序會使問題消失,這意味着.NET運行時會出現問題。

我們的應用程序是一個使用VS 2008 SP1開發的,面向.NET 3.5的WinForms應用程序。它以經典模式(客戶端公司策略)在Windows XP SP3上運行。

我搜索了其他人有類似的問題,但大多數點擊涉及GroupBoxes的自定義繪畫事件。我們的控制是純粹的標準 - 根本不使用油漆事件。

編輯:我如何故意耗盡桌面堆重現問題?我一直在玩任務管理器和GdiUsage,同時創造筆,畫筆和字體像瘋了似的。當然不會調用dispose,而是將它們存儲在列表中以避免垃圾回收。儘管如此,在用隨機顏色創建100 000筆後,根據監視工具,我只需要一些對象。

List<Pen> pens = new List<Pen>(); 
Random rnd = new Random(); 
for(int i = 0; i < 100000; i++) 
    pens.Add(new Pen(Color.FromArgb(rnd.Next()))); 
+0

只要您的筆名單超出範圍,每筆可以垃圾收集。將列表存儲在局部變量的類中。 –

+0

我的例子有點不清楚,列表實際上存儲在類中。 – Anlo

回答

2

這是泄漏手柄的程序的指示標誌。 Windows爲機器上運行的所有程序維護一個GDI和User對象的堆。每個單獨的進程都有一個10,000個句柄的配額,但是一些泄漏或繁重的程序可以使堆滿容量。一旦發生這種情況,請求筆繪製邊框(例如)將失敗,並且東西停止繪製。這並不總是被檢查,特別是在本地代碼中。

您可以使用Taskmgr.exe進程選項卡來診斷它。使用視圖+選擇列並勾選句柄,用戶對象和GDI對象。注意一個有很多這樣的(數百個)程序,並在使用該程序時數量穩步增加。

當您不使用Dispose()或使用語句來處理一次性對象(如筆,畫筆,字體,位圖)時,您可以在.NET程序中泄漏句柄。當程序沒有使用足夠的內存來觸發垃圾收集時,終結器可以釋放句柄。

+0

謝謝你的知識豐富和詳細的答案。我們在同一臺機器上運行的另一個.NET應用程序中使用了大量的GDI +繪圖。我們正在處理大多數圖形對象,但我們可能錯過了一些,將在明天進行調查...... – Anlo