2012-08-06 171 views
1

我有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將根本不起作用...

那麼,我將如何使整個點擊時程序執行停止工具條?

回答

4

你將不得不解決它,因爲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

4

也許檢查ShowDialog的結果?

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

(該using是因爲是負責調用Dispose()如果使用ShowDialog(),但當你調用Show()

1

試試這個。 Environment.Exit(0);

+0

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

2

我不認爲調用Application.Exit();是退出的好方法。首先,它可能不允許任何其他代碼執行可能已經到位的應用程序關閉清理。

相反,您應該從Login中返回一個DialogResult來指示需要關閉。然後,主窗體應該檢查並優雅地關閉。

3

結合Marc的回答,將Application.Exit更改爲Environment.Exit(0)

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