Application.Exit()未按预期工作

问题描述:

我有2个表单(mainlogin)。我打开使用这段代码的登录表单: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

+0

感谢您的满足感。但是,因为我不需要做任何其他的事情,这也算出来了:Environment.Exit(0);但是,非常感谢 – Mathlight 2012-08-06 11:26:13

+0

@TWCrap - 我意识到你喜欢这个解决方案,因为它会杀死应用程序,但是我希望你能够阅读这个[线程]中的响应(http://stackoverflow.com/questions/905544/whats-在解决该决定之前,在环境退出和应用程序关闭之间的区别)。 'Environment.Exit',除非绝对必要,否则不是一个好方法。 – 2012-08-06 11:35:28

+0

好吧,如果你这么说。我会建立一个检查;-) – Mathlight 2012-08-06 12:10:46

也许检查ShowDialog的结果?

using(var login = new Login()) { 
    if(login.ShowDialog() == DialogResult.OK) { 
     do_login(); 
    } 
} 

(该using是因为是负责调用Dispose()如果使用ShowDialog(),但当你调用Show()

试试这个。 Environment.Exit(0);

+0

谢谢;-)工作:D – Mathlight 2012-08-06 11:26:47

我不认为调用Application.Exit();是退出的好方法。首先,它可能不允许任何其他代码执行可能已经到位的应用程序关闭清理。

相反,您应该从Login中返回一个DialogResult来指示需要关闭。然后,主窗体应该检查并优雅地关闭。

结合Marc的回答,将Application.Exit更改为Environment.Exit(0)

private void afsluitenToolStripMenuItem_Click(object sender, EventArgs e) { 
    Environment.Exit(0); 
}