如何在Process.StandardOutput中禁用输出缓冲

时间:2010-10-02 03:37:49

标签: c# winapi process expect buffering

此问题不止一次被问过,但在任何讨论中我都没有找到满意的答案。

我正在启动一个命令行过程,该过程可以对STDOUT进行实时测量,大约每秒产生一个新结果。使用System.Diagnostics.Process.StandardOutput导致完全不可接受的延迟(超过20秒),因为STDOUT数据通过Process.StandardOutput StreamReader中的4k缓冲区工作,并且似乎没有任何方法可以解决这个问题。 / p>

调用Process.StandardOutput.BaseStream.Flush()不起作用。

我试过对Process.StandardOutput进行逐字节同步读取,但是我仍然比实际输出落后4k。

任何人都可以至少验证我能否以某种方式克服我在重定向STDOUT时遇到的所有缓冲问题,并且一旦它出现在shell窗口中就会立即收到我的应用程序中的数据?我可以继承Process类并更改StandardOutput流读取器的行为吗?我是否需要查看原始的WINAPI呼叫?

不知何故,这必须要完成,即使我最终编写非托管C ++来启动任务并使用输出,并将其链接起来。任何帮助都非常感谢;我的智慧结束了......

编辑:看来我需要的是可用于C / C ++,Perl,Python和Java的“期望”库的.Net实现(这是迄今为止我发现的唯一库)。有谁知道这样的野兽是否存在?

1 个答案:

答案 0 :(得分:1)

“[我有一种方法可以启动它,以至于它没有意识到它正被重定向?”是的:这正是Expect的领域。我知道没有.Net实施;这肯定是可行的,但是......