我有一个程序,使用BeginOutputReadLine以异步模式启动命令行进程。我的问题是,当仍有一些.OutputDataReceived事件被触发时,会触发.Exited事件。我在.Exited事件中所做的事情必须在我的所有.OutputDataReceived事件完成后才会发生,否则我将丢失一些输出。
我查看了Process类,看看是否有什么对我有用,等待流为空,但我找到的只是同步模式。你们有人可以帮忙吗?
感谢名单。
答案 0 :(得分:2)
我遇到了类似的问题:我的应用程序基本上是一些cygwin应用程序的前端,有时应用程序会在通过OutputDataReceived事件收到所有数据之前退出,而且我会丢失数据。
我的修复/黑客是在进程对象消失之前在输出AsyncStreamReader上调用WaitUtilEOF(因为WaitUtilEOF在.NET框架内部类上,所以必须使用反射)。这会导致调用者阻塞,直到通过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");
祝你好运!