【发布时间】:2017-06-23 02:58:05
【问题描述】:
如果从另一个线程甚至另一个程序调用process.Kill(),如果批处理脚本使用robocopy.exe,则该进程永远不会退出WaitForExit(),直到它完成,就好像它没有被杀死一样。
从批处理脚本调用 Robocopy.exe。其他所有脚本或程序都按您的预期结束。
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "batch.bat";
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.OutputDataReceived += CaptureHandler;
startInfo.RedirectStandardError = true;
startInfo.ErrorDataReceived += CaptureHandler;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
批处理脚本如下所示:
@echo off
call "robocopy.exe" "somedir" "somedest" /mir /fp /ndl /njh /njs /ns
我感觉它与输出处理程序有关。
我尝试在Kill() 调用之后和之前使用process.CancelErrorRead 和process.CancelOutputRead(),但没有运气。
奇怪的是,如果你使用process.WaitForExit(timeout) 重载,它会在另一个线程的Kill() 之后立即返回true。然而,它在撒谎。该过程仍在运行!如果您再次尝试process.WaitForExit(),按照 MSDN 文档,尽管HasExited 说是真的,它仍会等待该过程完成。
为确保异步事件处理已完成,请在从该重载接收到 true 后调用不带参数的 WaitForExit() 重载。
https://msdn.microsoft.com/en-us/library/ty0d8k56(v=vs.110).aspx
【问题讨论】:
-
你可以在最后尝试
process.Close(),或者如果你不需要重定向输出和错误(以防robocopy.exe处理它)你可以简单地使用System.Diagnostics.Process.Start(@"c:\batch.bat");(更正根据需要的路径),因为它只会打开批处理文件并退出该过程。 -
Close也不起作用。我需要等待它。
标签: c# .net windows batch-file robocopy