2016-04-14 58 views
1

我有一些像這樣的代碼:WaitForExit不會超時正確的,只是掛

process.CloseMainWindow(); 
if (!process.WaitForExit(5000)) { process.Kill(); } 

的想法是優雅地讓進程退出,但如果需要超過5秒,我認爲它需要殺害。

這似乎在大多數情況下工作,但如果該進程已拋出一個Windows錯誤消息,它只是掛起。我以前只有「process.Kill()」,並且工作,所以我不得不假定它實際上停留在WaitForExit(5000)調用上,即使我給它一個超時值。

這會發生什麼原因?

編輯:我想知道如果可能它是CloseMainWindow()實際掛,因爲該錯誤消息。在這種情況下,在嘗試CloseMainWindow()方法之前檢查進程的「響應」屬性實際返回「false」?如果是這樣,我可以檢查,然後使用殺死,如果是這樣的話。

+0

Windows正在終止進程,因此不會出現退出。 – jdweng

+0

不,過程仍在運行,我可以看到錯誤框後面的窗口。 –

+0

如果您遇到Marshal.GetLastWin32Error的窗口錯誤,那麼測試如何?如果進程正在運行,只殺死進程。在殺死之前測試過程是否仍然存在。 – jdweng

回答

0

首先,我要感謝Marc爲了解決這個問題,我從來沒有想到我會以這種方式重現錯誤。

在任何情況下,閱讀CloseMainWindow幫助文件()後更仔細,我看到了這一點:

Return Value 
Type: System.Boolean 
true if the close message was successfully sent; false if the associated 
process does not have a main window or if the main window is disabled (for 
example if a modal dialog is being shown). 

所以,正確的有它說,一個模式對話框(如錯誤我所看到的),會導致這個問題。現在我不確定它爲什麼不會在超時後死亡,但我認爲我可以使用這個返回值來殺死這個場景中的進程。

+0

您也可以檢查[HasExited property](https://msdn.microsoft.com/en-us /library/system.diagnostics.process.hasexited(v=vs.110).aspx),在while循環中檢查之前執行'process.Refresh()'。 – Quantic