我有一个使用 BeginOutputReadLine 以异步模式启动命令行进程的程序。我的问题是 .Exited 事件在仍有一些 .OutputDataReceived 事件被触发时被触发。我在 .Exited 事件中所做的必须仅在所有 .OutputDataReceived 事件完成后发生,否则我将丢失一些输出。
我查看了 Process 类,看看是否有任何对我有用的东西,比如等待流为空,但我发现的只是同步模式。你们能帮忙吗?
谢谢。
最佳答案
我遇到了类似的问题:我的应用程序本质上是某些 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");
祝你好运!
关于c# - 异步模式下 StandardOutput 流的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337166/