我有一個程序(服務器),它將四行輸出打印到控制檯,然後開始監聽來自客戶端程序的傳入連接。從另一個程序讀取標準輸出
我有另一個程序(測試儀),我想從服務器讀取標準輸出並分析它。我已經安裝了測試程序來啓動服務器,並得到其輸出如下:
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