我得到以下代码

    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()一起工作?

最佳答案

如果您不总是从StandardOutputStandardError读取,缓冲区可能会填满,从而导致进程阻塞。

您首先尝试阅读StandardOutput到最后。您运行的进程可能正在向StandardError写入大量数据,直到它阻塞并且无法写入更多数据为止。然后,这导致您的应用程序阻塞,因为直到进程关闭其StandardError,它才开始从StandardOutput读取。这将导致死锁,并且任何过程都不会继续。

我建议您使用我发布的here解决方案。它使用异步读取从StandardOutputStandardError进行读取,避免了死锁。

09-25 19:01