Process.StandardOutput.ReadToEnd () против Process.WaitForExit () - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть служба Windows, вызывающая консольное приложение и считывающая вывод консоли для выяснения состояния.

Я вызываю WaitForExit () с ограничением по времени после вызова StandardOutput.ReadToEnd ().

Вопрос в тех случаях, когда консольное приложение занимает больше времени, чем ограничение для 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 голосов
/ 21 декабря 2018
process.StandardOutput.ReadToEnd();

Этот вызов является блокирующим и будет ждать бесконечно, пока все выходные данные не будут сброшены в вызываемом процессе.

Это означает, что ваш вызов process.WaitForExit не нужен.Что вам действительно нужно сделать, это прочитать поток вывода в асинхронном режиме, чтобы вы могли выбрать, как долго вы будете ждать завершения вывода.

Вам также необходимо знать о других потоках, таких как StandardError, которые могуттакже содержат выходные данные.

В этой статье о переполнении стека есть несколько хороших примеров обоих этих случаев

...