Это было своего рода «уголовное исследование» с очень удивительным результатом - по крайней мере, для меня.Как ждать выходных потоков, когда Process.WaitForExit используется с жестким таймаутом
Мы выполняем внешние команды с использованием объекта Process. Мы фиксируем стандартный вывод (и стандартную ошибку - я удалил это из образца для ясности) асинхронно. Об этом несколько раз ответили. Код выглядит так и работает отлично:
var process = new Process
{
StartInfo =
{
UseShellExecute = false,
RedirectStandardOutput = true,
FileName = @"...\TestApp.exe"
}
};
process.OutputDataReceived += Process_OutputDataReceived;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
process.OutputDataReceived -= Process_OutputDataReceived;
Теперь, если я хочу, чтобы добавить жесткий тайм-аут в WaitForExit()
? Легко: есть перегруженная версия WaitForExit(int milliseconds)
. Таким образом, вызов, как это следует делать:
process.WaitForExit(60000);
Теперь это делает выходной захват неполный в некоторых случаях.
Это не секрет, по крайней мере, не для разработчиков Microsoft. После нескольких часов исследований я пришел к выводу, что с реализацией WaitForExit что-то должно быть не так. Так что я посмотрел в код, и я нашел этот комментарий в реализации Microsoft:
// If we have a hard timeout, we cannot wait for the streams
Вот мой вопрос - и я сделал некоторое усилие оценки без успеха:
Как я могу иметь жесткий тайм-аут на WaitForExit()
и в то же время убедиться, что захват вывода консоли завершен?
Не игнорировать возвращаемое значение WaitForExit(). Если это * true *, то вы знаете, что все еще может быть некоторый непрочитанный вывод. Так что спать немного, чтобы догнать его. –
Сон - это именно то, что я пытаюсь устранить. [sarcasm on] По моему скромному мнению, 'Thread.Sleep()' должен автоматически всплывать окно с сообщением «Я плохой программист», который должен быть подтвержден каждый раз. (Нет, шучу, может быть 0.05% случаев, когда 'Thread.Sleep()' также используется хорошими программистами по уважительным причинам тоже.) [sarcasm off] – freefall
Эта проблема началась давно, многократное перенаправление ввода-вывода, безусловно, было одним из Unix «худшие возможности, чтобы превратить его в Windows. Такие хаки просто не стареют. Не имея дело с взломом вывода stderr, это еще один, о котором вы, вероятно, пожалеете. Вам придется взломать хаки, вот что нужно. –