Следующий код зависает при вызове 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()). Таким образом, исправление заключалось в том, чтобы просто предоставить тайм-аут и повторить попытку до тех пор, пока процесс жив. Кстати, порядок отменяет, похоже, не имеет значения. –