Process.StandardOutput.ReadToEnd()与Process.WaitForExit()

时间:2018-12-21 08:59:36

标签: c# process waitforexit

我有一个Windows服务,该服务调用控制台应用程序,并读取控制台输出以了解状态。

在调用StandardOutput.ReadToEnd()之后,我要在一个时限内调用WaitForExit()。

问题在于,如果控制台应用程序花费的时间超过WaitForExit()的时间限制,那么ReadToEnd()会阻塞直到可执行文件退出,从而使WaitForExit()成为多余的?

      Process process = new Process();
      process.StartInfo = new ProcessStartInfo
      {
          FileName = pathToExecutable,
          Arguments = args,
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
      };
      process.Start();

      // Adding ReadToEnd() before the WaitForExit() call to prevent deadlocks in case Process buffer size becomes full
      // Ref: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.standardoutput?redirectedfrom=MSDN&view=netframework-4.5.2#remarks
      response = process.StandardOutput.ReadToEnd();

      process.WaitForExit(waitForExitInSeconds * 1000);
      process.Close();

      // Read response string and determine status

1 个答案:

答案 0 :(得分:0)

process.StandardOutput.ReadToEnd();

此调用是一个阻塞调用,它将永远等待,直到在被调用的进程中刷新所有输出为止。

这意味着您的process.WaitForExit调用是不需要的。您真正需要做的是以异步方式读取输出流,以便您选择等待输出完成的时间。

您还需要注意StandardError之类的其他流,其中也可能包含输出。

本文有关堆栈溢出的文章有some good examples of both these cases