以下代码在最后调用WaitForExit时挂起。如果我移除1秒长睡眠,它会彻底终止。有人可以告诉我该怎么做,这个过程会在我打电话给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
答案 0 :(得分:0)
我不知道F#,但这段代码有一些非常奇怪的东西; Process.Read()
是一个阻止调用,因此您要么必须使它们异步,要么调用.ReadToEnd()
,如果您想要等到重定向的事情完成。我会使用proc.Dispose()
或将其放在C#中的using
块中,而不是调用proc.kill()
,这应该在WaitForExit()
之后完成。
查看我对Opening a DOS Console的回答。
另请查看this reply,如果您重定向stdOut和stdErr,则必须至少进行一次异步。