Process.StandardOutput.ReadToEnd() против Process.WaitForExit()
У меня есть служба 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 ответ
process.StandardOutput.ReadToEnd();
Этот вызов является блокирующим и будет ждать вечно, пока весь вывод не будет сброшен в вызываемом процессе.
Это означает, что ваш процесс. Вызов WaitForExit не нужен. Что вам действительно нужно сделать, это прочитать выходной поток в асинхронном режиме, так что вы можете выбрать, сколько времени вы ждать, чтобы завершить вывод.
Вам также необходимо знать о других потоках, таких как StandardError, которые также могут содержать выходные данные.
В этой статье о переполнении стека есть несколько хороших примеров обоих этих случаев.