[英]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
從該行代碼中冒出來,這與不再存在的Process
或Process
對象處於無效狀態無關,而是現實我認為你可以選擇圍繞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.