gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:50:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com