gpt4 book ai didi

c# - StandardOutput.EndOfStream 挂起

转载 作者:太空狗 更新时间:2023-10-30 00:17:17 25 4
gpt4 key购买 nike

我正在我的 C# 应用程序中启动一个进程,该进程运行一个控制台应用程序。我已经重定向了标准输入和输出,并且能够通过 StandardOutput.ReadLine() 读取几行。我确信我已正确配置 ProcessStartInfo。

控制台应用程序在启动时会输出几行(以“标记”行结尾),然后等待输入。收到输入后,它再次输出几行(再次以“标记”行结尾),依此类推。我的意图是从中读取行,直到收到“标记”行,此时我知道发送适当的输入字符串。

我的问题是,经过几次迭代后,程序挂起。暂停调试器往往会将挂起置于对 StandardOutput.EndOfStream 的调用中。下面的测试代码就是这种情况:

while (!mProcess.StandardOutput.EndOfStream) // Program hangs here.
{
Console.WriteLine(mProcess.StandardOutput.ReadLine());
}

当我测试“标记”行时,如果我在读取该行后尝试访问 StandardOutput.EndOfStream,我会遇到同样的挂起:

string line = "";
while (!isMarker(line))
{
line = mProcess.StandardOutput.ReadLine();
}
bool eos = mProcess.StandardOutput.EndOfStream; // Program hangs here.

我可能做了什么导致此属性表现如此糟糕?

最佳答案

您不能在这里可靠地使用 EndOfStream。 StreamReader.EndOfStream 属性将调用 StandardOutput.Read() 如果它没有缓冲任何字符。如果进程未向其输出管道发送任何内容且未关闭它,则 Read() 调用将阻塞。这几乎可以保证发生,因为它将等待输入。在进程关闭输出管道的末端并且 StreamReader 消耗完所有缓冲字符之前,EndOfStream 不会返回 true。在程序终止时。

使用 BeginOutputReadLine() 可能是检测“标记”线的更好方法。请注意回调发生在另一个线程上。另请注意,不必等待进程发送标记,您写入的任何内容都将被缓冲,直到进程准备好读取它。请注意缓冲区很小,可能会出现死锁。

关于c# - StandardOutput.EndOfStream 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2767496/

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