以下代碼在最後對WaitForExit的調用中掛起。如果我消除1秒長的睡眠,它會乾淨地終止。有人可以告訴我該怎麼做,這個過程會在我打電話給Kill()之後不久就死掉了嗎?非常感謝。Process.kill似乎不起作用
let processStartInfo = System.Diagnostics.ProcessStartInfo("c:/cygwin/bin/bash.exe", "-c yes")
processStartInfo.CreateNoWindow <- true
processStartInfo.UseShellExecute <- false
processStartInfo.RedirectStandardOutput <- true
processStartInfo.RedirectStandardInput <- false
processStartInfo.RedirectStandardError <- true
use proc = new System.Diagnostics.Process()
proc.StartInfo <- processStartInfo
let f _ =()
proc.OutputDataReceived.Add f
proc.ErrorDataReceived.Add f
if not (proc.Start()) then
failwithf "Could not start"
proc.BeginErrorReadLine()
proc.BeginOutputReadLine()
// the process terminates fine without this
System.Threading.Thread.Sleep (1000)
printf "Waiting to die"
proc.Kill() // this does not seem to work
proc.CancelOutputRead()
proc.CancelErrorRead()
proc.WaitForExit() // execution gets stuck here, apparently forever
當然,該過程實際上終止,使用任務管理器來驗證。 WaitForExit()不只是等待進程終止,它還會等到所有重定向輸出被讀取。爲什麼沒有發生這種事情很難猜到,除了Cygwin非常古怪。將Kill()調用移過取消調用可能會有所幫助。 –
我發現你是正確的第一部分 - 非常感謝。我認爲問題在於,如果進程已經死了,WaitForExit不會終止(這直接違背了M $文檔,特別說明在kill()後調用它)。因此,只要流程處於活動狀態,修復只是提供超時和重試。順便說一句,取消的順序似乎沒有什麼差別。 –