gpt4 book ai didi

c# - 使用 BinaryReader 在 .NET 中重定向标准输出 - 检测 EOS/强制超时

转载 作者:行者123 更新时间:2023-11-30 18:05:16 24 4
gpt4 key购买 nike

我正在从 C# NET 4 应用程序中的进程重定向标准输出,然后在单独的线程上使用 BinaryReader 来读取它。 (它是二进制数据;需要解析分隔符的视频 block )

在进程输出最后一个字节之前一切正常,此时 BinaryReader 挂起,阻塞在 ReadBytes(int) 这对我没有好处;我需要知道流何时结束,以便将最后的数据 block 写入磁盘。

我会使用 Process.Exited 事件并将其视为等同于 EOS(然后终止线程)。但是 Process.Exited 从未被引发:大概进程正在等待我的应用程序在它结束之前关闭流。

不幸的是,this question似乎表明对 StandardOutput 的更高级别属性(例如 StandardOutput.EndOfStream)的任何调用都会导致访问 StandardOutput 的默认 StreamReader,因此我认为这种方法已经过时了。

有没有一种简单的方法可以检测流的结尾,或者使 BinaryReader 超时?

{
runningProcess.Start();

// Read standard output on a new thread
thrdReadStandardOut = new Thread(new ThreadStart(ReadStandardOutput));
thrdReadStandardOut.Start();

}

...

void ReadStandardOutput()
{
Monitor.Enter(runningProcess); // keep this section thread safe

var br = new BinaryReader(runningProcess.StandardOutput.BaseStream);
bool abort = false;

while (!abort)
{
try
{
byte[] bytes = br.ReadBytes(256);

if (StandardOutputReceived != null)
StandardOutputReceived(this, new GenericEventArgs<byte[]>(bytes));
}
catch (EndOfStreamException)
{
abort = true;
}
}

Monitor.Exit(runningProcess);
}

最佳答案

Process.Exited仅当您设置了 Process.EnableRaisingEvents 时才会引发事件为 true。如果这样做,您应该通过 Process.Exited 或通过同步 Process.WaitForExit 获取进程退出通知。方法。

如果您仍然没有收到此事件,请查看您的子进程是否正常终止(尽管即使那样我仍然希望 Exited 触发)。

关于c# - 使用 BinaryReader 在 .NET 中重定向标准输出 - 检测 EOS/强制超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5735909/

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