我有一个程序(服务器),它将四行输出打印到控制台,然后开始监听来自客户端程序的传入连接。从另一个程序读取标准输出
我有另一个程序(测试仪),我想从服务器读取标准输出并分析它。我已经安装了测试程序来启动服务器,并得到其输出如下:
Process server = new Process();
server.StartInfo.FileName = "server.exe";
server.StartInfo.UseShellExecute = false;
server.StartInfo.RedirectStandardInput = true;
server.StartInfo.RedirectStandardOutput = true;
server.StartInfo.RedirectStandardError = true;
server.Start();
StreamReader serverOutput = server.StandardOutput;
string line = serverOutput.ReadToEnd();
...
我遇到的问题是,当我执行服务器自己(或当我与测试执行它不重定向输出)我可以在控制台上看到所有四行。但是,当我使用上面的代码将服务器输出重定向到测试程序时,测试程序挂在“ReadToEnd”命令上,就好像它正在等待来自服务器的更多输出一样。
我也尝试使用“ReadLine”命令并将其放入一个FOR循环中重复4次。当我这样做时,前三行输出成功,然后挂在第4行“ReadLine”上,并且从不检索第4行的服务器输出。
最后,我也尝试使用“读取”命令尝试逐个获取字符,并且仍然无法从服务器输出的第4行获取任何字符。
任何有关我在这里失踪的建议?
更新: 经过大量的搜索后,我终于确定问题与输出缓冲有关。服务器程序(用C++编写)写入cout
,这似乎在打印到屏幕时自动刷新,但在将stdout重定向到测试程序时不会自动刷新。我可以将setvbuf(stdout, NULL, _IONBF, 0);
添加到服务器程序中,以使标准输出不被缓冲,但我更愿意找到另一种不涉及更改服务器程序的解决方案。
可能重复的[StandardOutput.ReadToEnd()挂起](http://stackoverflow.com/questions/7160187/standardoutput-readtoend-hangs) – 2013-03-26 17:55:10