c# - 异步模式下 StandardOutput 流的问题

标签 c# events redirectstandardoutput

我有一个使用 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/

相关文章:

linux - 将输出重定向为不同的用户

c# - 如何分析二进制序列化流的内容?

c# - 正则表达式 (C#) : match > < & (illegal XML chars) but only when contained within qutoes

c# - C#中如何判断TextChanged是否被键盘触发?

Scala 交互式解释器 (REPL) - 如何将输出重定向到文本文件?

c# - 如何在 Windows 窗体应用程序中将标准输出重定向到 c# 中的 psexec 进程的文件

c# - 谁可以访问 MVVM 模式中的数据库

c# - 使用 asp.net web api 和 knockout js 处理图像上传的输入表单

javascript - 如何用我的代码在变量中创建一个函数

javascript - jQuery 委托(delegate)对象而不是选择器作为第一个参数