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);
僅僅在您正在使用的控件上調用Dispose就不夠嗎?控制器應該自動處理其子女。當然,假設控制是正確書寫的。 – 2010-11-18 15:40:48
如果您有自定義控件並且正在重寫處置或更好,但未實現所需的額外處理,則需要在這些控件中執行操作,否則可能會陷入這種困境。您是否已驗證Dispose在自定義控件類型中的實際行爲...如果它們確實存在...?關於Dispose的好文章... http://blogs.msdn.com/b/jfoscoding/archive/2005/08/12/450835.aspx – 2010-11-18 15:40:48
我正在創建我的工具提示不正確,而這些提示並未處理 - 請參閱編輯。感謝您的回覆 – 2010-11-18 15:56:39