Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我可以在窗口析构函数(终结器)中调用MessageBox.Show()吗?_.net_Wpf_Destructor_Messagebox - Fatal编程技术网

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

.net 我可以在窗口析构函数(终结器)中调用MessageBox.Show()吗?,.net,wpf,destructor,messagebox,.net,Wpf,Destructor,Messagebox,尝试在窗口类的析构函数中调用MessagBox.Show(),但没有任何效果。在我的程序中有两个独立的窗口类,在它们的每一个析构函数中,我都尝试了这一点,即使我关闭一个窗口并保持另一个窗口打开,关闭窗口的析构函数中的MessageBox也不会显示 这两个析构函数如下所示: ~MainWindow() { MessageBox.Show("Exit Main Window", "Exit Main Window", MessageBoxButton.OK, MessageBoxImage.

尝试在窗口类的析构函数中调用MessagBox.Show(),但没有任何效果。在我的程序中有两个独立的窗口类,在它们的每一个析构函数中,我都尝试了这一点,即使我关闭一个窗口并保持另一个窗口打开,关闭窗口的析构函数中的MessageBox也不会显示

这两个析构函数如下所示:

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

尝试在安装的
窗口关闭事件中添加此代码

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

尝试在安装的
窗口关闭事件中添加此代码

 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {
    MessageBox.Show("Exit Main Window", "Exit Main Window", MessageBoxButton.OK, MessageBoxImage.Information);
 }
C#中的终结器(也称为析构函数)与示例C中的析构函数不同。它不是在对象实例之后进行清理的地方

您应该使用窗口对象中的事件来捕获这些内容

在实现
IDisposable
接口的对象中,只有在未正确处理该对象的情况下,才会运行终结器。
Dispose
方法通常使用
GC.SuppressFinalize
方法从终结器队列中删除对象,因此通常根本不调用终结器。清理是通过
Dispose
方法完成的

如果终结器被调用,它将由垃圾收集器运行的单独线程调用。它不是应用程序的主线程,因此不能在终结器中执行任何与GUI相关的操作。当对象即将被垃圾收集时,将调用终结器,因此不会在对象未使用后立即调用终结器,而是在该对象未使用后的一段时间内调用终结器

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

终结器(也称析构函数)在C中#不像示例C中的析构函数。它不是在对象实例之后进行清理的地方

您应该使用窗口对象中的事件来捕获这些内容

在实现
IDisposable
接口的对象中,只有在未正确处理该对象的情况下,才会运行终结器。
Dispose
方法通常使用
GC.SuppressFinalize
方法从终结器队列中删除对象,因此通常根本不调用终结器。清理是通过
Dispose
方法完成的

如果终结器被调用,它将由垃圾收集器运行的单独线程调用。它不是应用程序的主线程,因此不能在终结器中执行任何与GUI相关的操作。当对象即将被垃圾收集时,将调用终结器,因此不会在对象未使用后立即调用终结器,而是在该对象未使用后的一段时间内调用终结器


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

OK,所以我原来希望在关闭窗口时调用析构函数,这不一定会发生。为了让您的答案生效,我必须将这个处理程序添加到this.Closed.OK,所以我原来希望在关闭窗口时调用析构函数,但这不一定会发生。为了使您的答案有效,我必须将此处理程序添加到this.Closed中。您不能在终结器中合理地调用MessageBox。它很有可能消失在另一个窗口后面,并在程序退出时触发2秒终结器线程超时。改用Debug.Print()。您不能在终结器中合理地调用MessageBox。它很有可能消失在另一个窗口后面,并在程序退出时触发2秒终结器线程超时。改用Debug.Print()。