Я столкнулся с подобной проблемой: мое приложение по сути является внешним интерфейсом для некоторых приложений cygwin, и иногда приложение закрывается до того, как все данные получены через событие OutputDataReceived, и я теряю данные.
Мое исправление / хак - вызывать WaitUtilEOF на выходе AsyncStreamReader до исчезновения объекта процесса (необходимо использовать отражение, поскольку WaitUtilEOF находится во внутреннем классе .NET Framework). Это приводит к блокировке вызывающей стороны до тех пор, пока все асинхронные данные не будут сброшены через OutputDataReceived. Я не уверен, что это решит вашу проблему напрямую, но это может помочь ...
private static void WaitUntilAsyncStreamReachesEndOfFile(Process process, string field)
{
FieldInfo asyncStreamReaderField = typeof(Process).GetField(field, BindingFlags.NonPublic | BindingFlags.Instance);
object asyncStreamReader = asyncStreamReaderField.GetValue(process);
Type asyncStreamReaderType = asyncStreamReader.GetType();
MethodInfo waitUtilEofMethod = asyncStreamReaderType.GetMethod(@"WaitUtilEOF", BindingFlags.NonPublic | BindingFlags.Instance);
object[] empty = new object[] { };
waitUtilEofMethod.Invoke(asyncStreamReader, empty);
}
И я называю это так:
WaitUntilAsyncStreamReachesEndOfFile(process, "output");
Удачи!