Application.Exit()未按预期工作
问题描述:
我有2个表单(main
和login
)。我打开使用这段代码的登录表单:Application.Exit()未按预期工作
toolStripProgressBar1.Value = 50;
toolStripStatusLabel_dynamic.Text = "Proberen toegang te verkrijgen...";
Login login = new Login();
login.ShowDialog();
do_login();
而且我在登录表单的顶部有一个eventhandler
这样一个工具条菜单:
private void afsluitenToolStripMenuItem_Click(object sender, EventArgs e) {
Application.Exit();
}
但是这两种形式都被关闭之后,程序继续工作(它称为功能do_login
。)但变量没有设置,并且表格不见了,所以do_login
将根本不起作用...
那么,我将如何使整个点击时程序执行停止工具条?
答
你将不得不解决它,因为Application.Exit()
的定义如下。
通知所有消息泵必须终止,然后在消息处理后关闭所有应用程序窗口。
那么它的说法是,一旦所有的消息都充分处理完毕,就会退出,但因为你有一个需要处理的消息对话框关闭后,必须先完成这一点。您正在正确地执行退出,但是您将必须检查null
,并在do_Login()
方法中返回null
。
答
也许检查ShowDialog
的结果?
using(var login = new Login()) {
if(login.ShowDialog() == DialogResult.OK) {
do_login();
}
}
(该using
是因为你是负责调用Dispose()
如果使用ShowDialog()
,但不当你调用Show()
)
答
我不认为调用Application.Exit();是退出的好方法。首先,它可能不允许任何其他代码执行可能已经到位的应用程序关闭清理。
相反,您应该从Login中返回一个DialogResult来指示需要关闭。然后,主窗体应该检查并优雅地关闭。
答
结合Marc的回答,将Application.Exit
更改为Environment.Exit(0)
。
private void afsluitenToolStripMenuItem_Click(object sender, EventArgs e) {
Environment.Exit(0);
}
感谢您的满足感。但是,因为我不需要做任何其他的事情,这也算出来了:Environment.Exit(0);但是,非常感谢 – Mathlight 2012-08-06 11:26:13
@TWCrap - 我意识到你喜欢这个解决方案,因为它会杀死应用程序,但是我希望你能够阅读这个[线程]中的响应(http://stackoverflow.com/questions/905544/whats-在解决该决定之前,在环境退出和应用程序关闭之间的区别)。 'Environment.Exit',除非绝对必要,否则不是一个好方法。 – 2012-08-06 11:35:28
好吧,如果你这么说。我会建立一个检查;-) – Mathlight 2012-08-06 12:10:46