Process.kill似乎不起作用

时间:2015-05-14 21:16:57

标签: .net f#

以下代码在最后调用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

1 个答案:

答案 0 :(得分:0)

我不知道F#,但这段代码有一些非常奇怪的东西; Process.Read()是一个阻止调用,因此您要么必须使它们异步,要么调用.ReadToEnd(),如果您想要等到重定向的事情完成。我会使用proc.Dispose()或将其放在C#中的using块中,而不是调用proc.kill(),这应该在WaitForExit()之后完成。

查看我对Opening a DOS Console的回答。

另请查看this reply,如果您重定向stdOut和stdErr,则必须至少进行一次异步。