Environment.Exit(0) 、Application.Exit() 、this.Close() 、this.Dispose()的區別

滄海一滴發表於2013-11-13

Application.Exit:通知winform訊息迴圈退出。程式會等待所有的前臺執行緒終止後才能真正退出。
是一種強行退出方式,就像 Win32 的 PostQuitMessage()。它意味著放棄所有訊息泵,展開呼叫堆疊,並將執行返回給系統
方法停止在所有執行緒上執行的所有訊息迴圈,並關閉應用程式的所有視窗
解決方法:
1. 背景執行緒
為避免因為執行緒造成程式無法退出,可以將執行緒設定為後臺執行緒(IsBackground = true)。
當然,這樣一來,你需要自行處理後臺執行緒的資料操作安全。

Environment.Exit:立即終止當前程式,應用程式即強制退出。返回exitcode給作業系統,
相比之下Environment.Exit更具有強制性,清理資源更徹底。
因此我們可以構造以下的restart()函式重新啟動應用程式

        private static void ReStart() 
        { 
            Application.Exit(); 
            System.Diagnostics.Process.Start(Application.ExecutablePath); 
        } 
用Environment.Exit就無法完成這個功能
 

this.Close()是關閉當前視窗  
Application.Exit()是退出應用程式  
如果當前視窗是啟動訊息迴圈的主視窗,那麼兩句起的作用差不多;
如果this代表的視窗物件是一個子視窗,this.Close()僅關閉一個視窗,
而Application.Exit()關閉當前所有應用程式窗體。

Form.close與Application.Exit()區別很有意思,在父子視窗環境中。
呼叫Application.exit時,首先會呼叫子視窗的closing事件。如果有子視窗事件中設定了cancel=true,則程式退出中斷。
直接呼叫父視窗的close()方法,不會呼叫子視窗的closing事件,程式直接退出。

在 Windows(Win32 或 .NET)中關閉應用程式的正確方式是關閉它的主應用程式視窗(例如 Form.Close)。主訊息泵結束後依然存在的任何視窗都需要手動關閉。在應用程式退出之前通過呼叫 Form.Close 或 Form.Dispose 來關閉視窗是清除視窗的良好做法,但這需要您有意識地去做。我們需要記住,.NET Framework 的 OnClosing() 是 Win32 的託管版本的 WM_CLOSE,而非 WM_DESTROY。

另外,如果您使用 form.Close(),通過處理 OnClosing 或 OnClosed 事件,就可以讓您的應用程式清理內容、關閉檔案等。如果您通過 Application.Exit 強行退出應用程式,就無法呼叫這些事件。

//用this.this.Close(); 一直關不掉,用 Application.Exit(); 要關閉兩次,以下解決辦法是關閉只彈出一次

private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (DialogResult.OK == MessageBox.Show("提示資訊", "請選擇", MessageBoxButtons.OKCancel))
            {
               // this.Close();
                this.FormClosing -= new FormClosingEventHandler(this.MainFrm_FormClosing);//為保證Application.Exit();時不再彈出提示,所以將FormClosing事件取消
                Application.Exit();
            }
        }

因此在Form的MainFrm_FormClosing事件中呼叫this.Close()會一直關不掉視窗,因為from.Close()會呼叫OnClosing事件,陷入迴圈中
如果呼叫Application.Exit();要關閉兩次,因為 程式會等待所有的前臺執行緒終止後才能真正退出,Form窗體就是前臺執行緒,需要退出後程式才真正退出

相關文章