我可以在Window析构函数(终结器)中调用MessageBox.Show()吗?

时间:2013-04-29 17:43:25

标签: .net wpf destructor messagebox

尝试在Window类的析构函数中调用MessagBox.Show(),但它什么也没做。我的程序中有两个单独的Window类,在每个析构函数中我都试过这个,即使我关闭一个窗口而另一个窗口打开,关闭窗口的析构函数中的MessageBox也不会显示。

这两个析构函数看起来像这样:

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

2 个答案:

答案 0 :(得分:1)

C#中的终结器(aka析构函数)与示例C中的析构函数不同。它不是在对象实例之后清理的地方。

你应该使用window对象中的事件来代替这些东西。

在实现IDisposable接口的对象中,仅在对象未正确放置时才运行终结器。 Dispose方法通常使用GC.SuppressFinalize方法从终结器队列中删除对象,因此通常不会调用终结器。清理工作由Dispose方法完成。

如果终结器调用,则它由垃圾收集器运行的单独线程完成。它不是应用程序的主线程,因此您无法在终结器中执行任何与GUI相关的操作。当对象即将被垃圾收集时,将调用终结器,这样在它不被使用之后就不会发生,但在此之后的某个时间。

此外,即使对象配置不正确,也无法保证终结器的运行。当应用程序关闭时,垃圾收集器将在终结器队列中的对象中运行终结器一段时间,但是在一段特定的时间之后它将放弃并终止所有对象而不调用终结器。

答案 1 :(得分:0)

尝试在Window Closing内置事件中添加此代码。

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