C# процесс зависает из-за StandardOutput.ReadToEnd() и StandardError.ReadToEnd()
Для процессов с большим количеством выходных данных или ошибок, пытаясь перенаправить стандартный вывод и ошибки с помощью простого
string output = process.StandardOutput.ReadToEnd();
string err = process.StandardError.ReadToEnd();
process.WaitForExit();
приведет к зависанию программы и никогда не завершится.
1 ответ
Решение
Как оказалось, большие объемы вывода заполняют буферы для ReadToEnd(), заставляя их никогда не завершаться. Одно из решений, которое мне показалось надежным, - это создать обработчик событий, чтобы построчно реагировать на выходную строку без необходимости реагировать сразу на большой блок вывода / ошибки.
//create event handler
process.OutputDataReceived += new DataReceivedEventHandler(
(s, e) =>
{
//do something with the output data 'e.Data'
log.Info("O: "+e.Data);
}
);
process.ErrorDataReceived += new DataReceivedEventHandler(
(s, e) =>
{
//do something with the error data 'e.Data'
log.Info("E: "+e.Data);
}
);
//start process
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();