【发布时间】:2010-05-09 03:50:31
【问题描述】:
我正在使用 C# 来读取另一个程序的 STDOUT。如果我这样做:
StreamReader reader = process.StandardOutput;
reader.ReadToEnd();
是否保证将最后的内容全部刷新到程序的 STDOUT 中?还是有点像 TCP,我必须有一个消息终止符或长度标头?
【问题讨论】:
我正在使用 C# 来读取另一个程序的 STDOUT。如果我这样做:
StreamReader reader = process.StandardOutput;
reader.ReadToEnd();
是否保证将最后的内容全部刷新到程序的 STDOUT 中?还是有点像 TCP,我必须有一个消息终止符或长度标头?
【问题讨论】:
默认情况下 StandardOutput 是缓冲的,这意味着您可能会从另一端获得完整的消息(或多个完整的消息)。但它并不能真正保证,特别是因为您正在读取的进程可能已经改变了 StandardOutput 的缓冲。
消息终结符是解决问题的最佳方法。虽然通常进程通过 StandardOutput 进行通信,但一切都是基于行的,所以简单地使用换行符作为消息终止符可能是最简单和最常见的起点。
【讨论】:
reader.ReadToEnd() 在进程终止之前不会返回,因此在调用之后您应该会看到它写入标准输出的所有内容。缓冲只会影响它从其他程序进入阅读器缓冲区的速度,但您的代码无法区分(至少在这个线程上),因为它仍在等待ReadToEnd() 返回。
【讨论】: