我有一个程序(服务器),该程序将四行输出打印到控制台,然后开始侦听来自客户端程序的传入连接。
我有另一个程序(测试仪),我想在其中读取服务器的标准输出并进行分析。我已经设置了测试程序来启动服务器并获得其输出,如下所示:
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”命令,并将其放入重复4次的FOR循环中。当我这样做时,输出的前三行被成功拾取,然后挂在第四行“ ReadLine”上,从不检索服务器输出的第四行。
最后,我还尝试使用“读取”命令尝试一次获取一个字符,但仍然无法从服务器输出的第4行获取任何字符。
关于我在这里缺少什么的任何建议?
更新:
经过大量搜索之后,我终于确定该问题与输出缓冲问题有关。服务器程序(用C ++编写)写入
cout
,在打印到屏幕时似乎自动刷新,但是在将stdout重定向到测试程序时不会自动刷新。我可以将setvbuf(stdout, NULL, _IONBF, 0);
添加到服务器程序中,以使stdout不被缓冲,但是我更希望找到另一种不涉及更改服务器程序的解决方案。 最佳答案
当流结束时,ReadToEnd将返回。程序关闭时会发生这种情况。
您可以尝试使用事件处理程序server.OutputDataReceived
读取数据。这样,您将异步接收它,而不会阻塞程序。