我收到了以下代码
System.Diagnostics.Process capp = new System.Diagnostics.Process();
capp.StartInfo.UseShellExecute = false;
capp.StartInfo.RedirectStandardOutput = true;
capp.StartInfo.RedirectStandardError = true;
capp.EnableRaisingEvents = false;
capp.StartInfo.FileName = "app.exe";
capp.StartInfo.Arguments = "-i -v -mj";
capp.Start();
consoleOutput = capp.StandardOutput.ReadToEnd() + capp.StandardError.ReadToEnd();
if (!capp.WaitForExit(10000)) capp.Kill();
和问题,如果外部应用程序正常工作,它完成任务所需的时间不到10秒。如果因为某些原因停止/挂起,尽管使用
if (!capp.WaitForExit(10000)) capp.Kill();
正如其他一些主题所建议的,它一直在努力。在我的情况下,上面的行似乎根本不起作用,我想这与我读过StandardOutput和StandardError的事实有关。如何修复我的代码以使读取输出和WaitForExit()无处不在?
答案 0 :(得分:4)
如果您不总是从 StandardOutput
和StandardError
读取,则缓冲区可以填充,从而导致进程被阻止。
您首先尝试阅读StandardOutput
到最后。您运行的进程可能会将大量数据写入StandardError
,直到它阻塞并且无法写入更多内容。然后,这会导致您的应用程序阻塞,因为它甚至不会从StandardError
开始读取,直到该进程关闭其StandardOutput
。这会造成死锁,两个进程都不会继续。
我建议您使用我发布的解决方案here。它使用异步读取从StandardOutput
和StandardError
读取,避免死锁。