在WinForms應用程序中,我有多個實例將控件添加到容器以響應用戶操作(panel.Controls.Add(new CustomControl(...))
),然後再清除面板(panel.Controls.Clear()
)並重新使用它。清除容器的Controls屬性並確保控件正確處置的最安全方法是什麼?
在生產中,應用程序偶爾會拋出一個與GDI錯誤或未能加載ImageList
相關的異常。這通常發生在資源有限的計算機上,以及在一天中密集使用應用程序的用戶。這似乎很明顯,我有一個GDI處理泄漏,我應該處置從容器中清除的控件,但是我能找到的任何解釋都不清楚控件何時何地處理。
清除容器後應立即處理子控件嗎?喜歡的東西:
var controls = new List<Control>(_panel.Controls.Cast<Control>());
_panel.Controls.Clear();
foreach (var c in controls) c.Dispose();
或者我應該跟蹤控制在一個列表,並調用處理容器的Dispose()
方法?如:
List<Control> _controlsToDispose = new List<Control>();
void ClearControls()
{
_controlsToDispose.AddRange(_panel.Controls.Cast<Control>());
_panel.Controls.Clear();
}
void Dispose()
{
...
foreach (var c in _controlsToDispose) c.Dispose();
}
所以沒有必要將控件放置在容器的Dispose()方法中?我可以在清除容器後儘快做到這一點? – 2011-03-29 09:54:13