簡體   English   中英

如何在沒有“進程退出”異常的情況下終止進程?

[英]How to kill a process without getting a “process has exited” exception?

我使用Process.Kill()來殺死進程。 像這樣:

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

有時進程將在行之間退出,因此if Kill將導致異常,則控制將進入內部:

System.InvalidOperationException
Cannot process request because the process (ProcessIdHere) has exited.
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.Kill()
//my code here

現在將代碼包裝到try-catch中似乎不是一個好主意,因為可以出於其他原因調用InvalidOperationException

有沒有辦法在所描述的場景中殺死進程而不會出現異常?

你可以P / Invoke TerminateProcess傳遞它Process.Handle 然后手動評估它的原因( GetLastError() )。 粗略地說, Process.Kill()在內部做什么。

但請注意, TerminateProcess是異步的。 因此,您必須等待進程句柄以確保完成。 使用 Process.Kill()為您做到這一點。

更新:更正, Process.Kill()也異步運行。 所以你必須使用WaitForExit()等待終止完成 - 如果你在意的話。

坦率地說,我不會打擾。 當然,總是存在(遠程?)機會,某些“任意”的InvalidOperationExcepion從該行代碼中冒出來,這與不再存在的ProcessProcess對象處於無效狀態無關,而是現實我認為你可以選擇圍繞Kill的嘗試/捕獲。

此外,根據您的應用程序,您可以考慮記錄此殺死,因為它似乎是某種最后的手段。 在這種情況下,使用它記錄實際的InvalidOperationException 如果事情變得奇怪,你至少要有你的日志來檢查Kill失敗的原因。

盡管如此,您可能還需要考慮捕獲/處理Win32Exception ,原因相同。

您需要使用HasExited

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

看這里:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM