2013-04-29 54 views
1

嘗試在Window類的析構函數中調用MessagBox.Show(),但它什麼也沒做。我在我的程序中有兩個獨立的Window類,在它們的每個析構函數中,我嘗試了這種方法,即使關閉了一個窗口並將另一個窗口打開,也未顯示關閉窗口的析構函數中的MessageBox。我可以在Window析構函數(finalizer)中調用MessageBox.Show()嗎?

兩個析構函數是這樣的:

~MainWindow() 
{ 
    MessageBox.Show("Exit Main Window", "Exit Main Window", MessageBoxButton.OK, MessageBoxImage.Information); 
} 
+1

您無法在終結器中合理調用MessageBox。高可能性消失在另一個窗口的後面,並在程序退出時跳過2秒終結器線程超時。使用Debug.Print()代替。 – 2013-04-29 17:50:00

回答

1

C#中的終結(又名析構函數)是不喜歡在例如C.析構函數這是不是你的對象實例後清理的地方。

您應該使用窗口對象中的事件來代替這些事情。

在實現IDisposable接口的對象中,只有在對象未正確放置時纔會運行終結器。 Dispose方法通常使用GC.SuppressFinalize方法從終結器隊列中刪除對象,因此通常不會調用終結器。清理由Dispose方法完成。

如果終結器調用,它是由垃圾收集器運行的單獨線程。這不是你的應用程序的主線程,所以你不能在終結器中做任何與GUI相關的GUI。當對象即將被垃圾收集時,終結器將被調用,以便在它未被使用之後不會發生,但之後的一段時間。

此外,即使對象未正確放置,也不能保證終結器運行。當應用程序關閉時,垃圾收集器將從終結器隊列中的對象運行終結器一段時間,但經過一段特定時間後,它將放棄並終止所有對象而不調用終結器。

0

嘗試在Window Closing事件添加該代碼insted的。

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    MessageBox.Show("Exit Main Window", "Exit Main Window", MessageBoxButton.OK, MessageBoxImage.Information); 
} 
+0

好吧,事實證明,我期待在窗口關閉時調用析構函數,這不一定會發生。爲了您的工作答案,我必須將此處理程序添加到this.Closed。 – user2320724 2013-04-29 17:49:10

相關問題