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();
Другие вопросы по тегам