2013-01-13 117 views
0

我有System :: Windows :: Forms :: UserControl的子類,它分配一些非託管資源,這些資源必須在析構函數中釋放。它通過WindowsFormsHost在WPF應用程序中使用。如果控件在應用程序中至少顯示一次,則將調用它的析構函數。但是,如果控件的實例被創建,但從未顯示只有終結器被調用。如何確保析構函數被調用?

爲什麼會發生這種情況?

回答

1

調用IDisposable :: Dispose()調用你的析構函數。這是一個可選的調用,它必須由其他代碼明確制定。將控件添加到容器的控件集合(如表單或面板)並且容器得到正確處置時,您會得到它。當用戶通過點擊關閉按鈕關閉一個窗口時,一般情況下它是自動的。

許多情況下,「自動」不起作用。臭名昭着的是當你通過調用Controls :: Remove/At()或Controls :: Clear()方法來自己移除一個控件時。當你剛剛使用gcnew創建實例時,它肯定不會自動執行,但是通過將其添加到容器控件中,它實際上並未實際顯示它。 ControlsCollection類無法完成其工作。

可選通話需要備份保證通話。您必須總是實施!非終結器時,需要釋放非託管資源。因此,無論出於何種原因,當使用您的控件的代碼跳過可選調用時,它們都不會泄露。那!終結者將會調用,稍後。

+0

強迫我的類的用戶調用析構函數的最佳方法是什麼?在終結器中拋出異常? – Bojan

1

默認情況下,CLI類封裝實現IDisposable。如果您沒有在您的實例上調用MyCLIClass::Dispose(),則會調用析構函數而不是。我不是WPF專家,但是當您顯示您的控件時,您必須將引用傳遞給處理控件處理的其他類。當你不這樣做時,它永遠不會被調用。

相關問題