2010-11-18 79 views
2

我正在與舊的「錯誤創建窗口句柄」的樂趣作鬥爭。我的應用程序有一箇中心區域,用於承載用戶當前正在處理的任何控制。當用戶加載一個新的控件時,我摧毀了舊的控件。或者至少我嘗試。當我運行任務管理器時,我驚訝地發現,隨着新控件的加載,GDI對象的數量並未減少。這正是我正在做的(試圖)殺掉我完成的一個控制。該計數器最後顯示了一個巨大的數字,這似乎是正確的,但任務管理器中的GDI對象保持不變,直到達到10,000,然後一切都崩潰了。錯誤創建窗口句柄

private void RecursivelyKillYourself(Control C) { 
     if (C.Controls != null && C.Controls.Count > 0) { 
      List<Control> Controls = C.Controls.OfType<Control>().ToList(); 
      C.Controls.Clear(); 
      Controls.ForEach(c_inner => RecursivelyKillYourself(c_inner)); 
     } else { 
      C.Dispose(); 
      num++; 
     } 
    } 

編輯

固定 - 得確保你正確地創建工具提示。另外,正如一位評論員指出的那樣,漫長的愚蠢的遞歸方法是不必要的。只需簡單的Dispose即可。

(new SMcMaster.TabOrderManager(this)).SetTabOrder(SMcMaster.TabOrderManager.TabScheme.AcrossFirst); 

ToolTip T = new ToolTip(); 
T.SetToolTip(btnAddPropertyInvoice, "Add Properties"); 
components.Add(T); 
+1

僅僅在您正在使用的控件上調用Dispose就不夠嗎?控制器應該自動處理其子女。當然,假設控制是正確書寫的。 – 2010-11-18 15:40:48

+0

如果您有自定義控件並且正在重寫處置或更好,但未實現所需的額外處理,則需要在這些控件中執行操作,否則可能會陷入這種困境。您是否已驗證Dispose在自定義控件類型中的實際行爲...如果它們確實存在...?關於Dispose的好文章... http://blogs.msdn.com/b/jfoscoding/archive/2005/08/12/450835.aspx – 2010-11-18 15:40:48

+0

我正在創建我的工具提示不正確,而這些提示並未處理 - 請參閱編輯。感謝您的回覆 – 2010-11-18 15:56:39

回答

1

驗證正在妥善解決Dispose