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

标签 c# .net process io

我正在从 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/

相关文章:

c# - 进程 "System"导致CPU占用率高

javascript - Node webkit - 无法派生子进程(错误 : spawn EACCES )

c# - 注入(inject) 2.1 ActivationException : Error activating string

.net - System.Drawing.Color 相等运算符不会将 0xffffffff 视为 Color.White

c# - 如何清除插入之间的 FormView 数据

c# - NancyFx 将模型绑定(bind)到动态类型?

c# - 为什么 try/finally 而不是 "using"语句有助于避免竞争条件?

c++ - 如何从进程名称中获取窗口标题?

c# - WCF服务中具有C#的json?

c# - 试图简化 LINQ 表达式