我得到以下代码
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()一起工作?
最佳答案
如果您不总是从StandardOutput
和StandardError
读取,缓冲区可能会填满,从而导致进程阻塞。
您首先尝试阅读StandardOutput
到最后。您运行的进程可能正在向StandardError
写入大量数据,直到它阻塞并且无法写入更多数据为止。然后,这导致您的应用程序阻塞,因为直到进程关闭其StandardError
,它才开始从StandardOutput
读取。这将导致死锁,并且任何过程都不会继续。
我建议您使用我发布的here解决方案。它使用异步读取从StandardOutput
和StandardError
进行读取,避免了死锁。