2015-04-07 54 views
1

當達到某個標準時,我的應用程序運行Application.Restart重新啓動應用程序。這留下了一個進程掛起,以便當應用程序恢復時它會抱怨它已經在運行(我有代碼來檢查應用程序只允許一個實例)。Application.Restart使進程掛起

這個過程可以通過調用Environment.Exit來消除,但是這與Application.Restart衝突。 當重新啓動被調用,然後Environment.Exit,重新啓動被中止,應用程序只是退出而不嘗試重新啓動。

我該如何解決這個問題?

更多信息:

我的主類實例化一個子類。如果滿足某些條件,此子類將調用Application.Restart。 這會導致.Net調用主類上的FormClosed事件。此事件調用Environment.Exit以確保在用戶退出應用程序時所有進程都關閉,導致重新啓動被中止。

回答

1

Environment.Exit(0)是kernel32.dll中的ExitProcess(0)的API等效物。它會立即終止流程。當主線程正在處理時,Application.ExitApplication.Restart都會掛起。

對於你的情況我建議使用Environment.Exit,並開始一個新的實例之前:

System.Diagnostics.Process.Start(Application.ExecutablePath); 
Environment.Exit(0) 

這將肯定退出你的應用程序。

+0

我添加了一個標誌,指出它是否是軟件重新啓動,並在您的示例中檢查Process.Start周圍的標誌。這使得程序停止了。但是,我的應用程序啓動太快,所以當它檢查已有的進程時,其他進程還沒有完成退出。我通過在檢查其他進程之前添加一個簡單的Thread.Sleep來解決這個問題。 – GTHvidsten

1

根據猜測,代碼中的某些內容會阻止應用程序在重新啓動前正常關閉,因此請確保檢查代碼(即FormClosed)。嘗試使用可執行文件路徑開始一個新進程,然後關閉原始文件。

System.Diagnostics.Process.Start(Application.ExecutablePath); 
Application.Exit(); 

希望它有助於..!

編輯:

Why is Application.Restart() not reliable?

這應該幫忙,所以可能DUP!