Краткий ответ: нет, есть такой метод на Процесс , который делает то, что вам нужно.
Длинный ответ: да, вы, похоже, можете это сделать, но этопотребует от вас гораздо больше работы.
(Тем не менее, как говорит Ганс Пассант, это также зависит от другого процесса раннего сброса. Если это не так, вам ничего не поможет.)
Метод 1 (жесткий)
BeginOutputReadLine , по-видимому, создает синхронизированную оболочку вокруг фактического базового Stream.BeginRead метода, обеспечивая егобуферизует достаточно данных и вызывает ваш обработчик OutputDataReceived .(И на самом деле это довольно много работы, чтобы дать вам полные строки, а не куски, не говоря уже о синхронизированной диспетчеризации событий, из того, что я вижу с помощью ILSpy.)
Так что вы можете попытаться вызвать StandardOutput.BaseStream.BeginRead напрямую, пропуская OutputDataReceived и BeginOutputReadLine полностью, поэтому вы можете получать чанки по мере их поступления.
К сожалению,это означает, что вам нужно выполнить кодирование самостоятельно (поскольку потоки работают с байтами, а не с символами, а StandardOutput.CurrentEncoding обеспечивает основную часть этой поддержки), вам нужно будет выполнить все асинхронные операции чтения самостоятельно.( Stream.BeginRead - это не очень приятный API для работы), и вам придется самостоятельно выполнять синхронизацию.
Очень весело (и много шансов ошибиться).
Метод 2 (проще), почти асинхронный
Вы также можете читать из StandardOutput синхронно uпеть StandardOutput.Читать .Если вы не хотите блокировать, вы можете раскрутить другой поток или использовать TaskFactory.StartNew :
var readTask = TaskFactory.StartNew(() => {
try
{
while ((int c = process.StandardOutput.Read()) != -1)
{
...
}
}
catch
{
// don't want to kill the process if something goes wrong above;
// uncaught exceptions on background threads do that.
}
});
И затем в тот момент, когда вы хотите быть уверенным, что чтение завершено,вы говорите
readTask.Wait();