Используя System.Diagnostics.Process асинхронно, как мне убедиться, что я получил последний вывод, прежде чем определить, что он завершился? - PullRequest
3 голосов
/ 07 сентября 2011

Рассмотрим этот пример кода C # (ненужные фрагменты не учтены):

using System.Diagnostics.Process;

var process = new Process();
var startInfo = process.StartInfo;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputHandler;
process.ErrorDataReceived += ErrorHandler;
process.Exited += ExitHandler;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

Теперь я хочу уведомить слушателя, что процесс завершен после того, как больше нет вывода (stdout / stderr) для чтения из него . Как в моем методе ExitHandler убедиться, что все оставшиеся stdout / stderr обработаны OutputHandler и ErrorHandler, прежде чем определить, что процесс действительно завершился?

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

При явном использовании Process.WaitForExit (-1) возникает блокировка. Он не вернется, пока асинхронные считыватели для stdout и stderr не укажут состояние конца файла. Вызовите его в обработчике события Exited. Вы должны использовать время ожидания -1, иначе это не сработает. Или просто WaitForExit (). Что хорошо, вы знаете, что он уже вышел.

0 голосов
/ 07 сентября 2011

Событие Exited вызывается, когда процесс прерывается или завершается.Поэтому никогда не должно возникать ситуации, когда все еще есть данные для чтения.

Когда операционная система завершает процесс, любой компонент процесса, ожидающий выхода, получает уведомление.Затем компонент может получить доступ к информации о связанном процессе, которая все еще находится в памяти операционной системы (например, свойство ExitTime), используя дескриптор, который он имеет для процесса.

Поскольку связанный процесс завершился, дескрипторсвойство компонента больше не указывает на существующий ресурс процесса.Вместо этого его можно использовать только для доступа к информации операционной системы о ресурсе процесса.Системе известны дескрипторы завершенных процессов, которые не были освобождены компонентами Process, поэтому она хранит информацию о свойствах ExitTime и Handle в памяти до тех пор, пока компонент Process не освободит ресурсы специально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...