此問題已被問過不止一次,但在任何這些討論中我都沒有找到滿意的答案。如何在Process.StandardOutput中禁用輸出緩衝
我正在啓動一個命令行進程,它可以對STDOUT進行實時測量,每秒產生一個新結果。使用System.Diagnostics.Process.StandardOutput會導致完全無法接受的延遲(超過20秒),因爲STDOUT數據通過Process.StandardOutput StreamReader中的4k緩衝區工作,似乎沒有任何辦法可以解決此問題。
調用Process.StandardOutput.BaseStream.Flush()不起作用。
我試着做一個逐字節的Process.StandardOutput同步讀取,但我仍然在實際輸出後面4k。
任何人都可以至少驗證我是否有可能以某種方式克服我重定向STDOUT時遇到的所有緩衝問題,並在應用程序出現在shell窗口中時立即接收數據?我可以從Process類繼承並更改StandardOutput流讀取器的行爲方式嗎?我是否需要查看原始WINAPI電話?
不知何故,這必須完成,即使我最終編寫非託管C++來啓動任務並消耗輸出,並將其鏈接到任何幫助中。我在我的智慧結束...
編輯:看來,我需要的是一個.Net實現的「expect」庫可用於C/C++,Perl,Python和Java(這些是迄今爲止我發現的唯一的)。有誰知道這樣的野獸是否存在?
糟透了,你從來沒有得到這個問題的好回答... – 2011-07-11 21:44:45
是的。我最終獲得了外部命令的源代碼,並用顯式STDOUT緩衝區刷新重新編譯它。不過,我仍然想解決原來的問題。我玩弄了自己編寫的.Net Expect實現,但重新編譯外部工具似乎是避免讓我的老闆對我大吼的更好方法。 – 2011-07-20 17:42:00
我一直在努力解決同樣的問題。我正在讀取控制檯輸出在一個單獨的線程(或實際2:1的標準錯誤,1爲標準輸出)。事實證明,StandardOutput只在使用像Peek這樣的調用時纔會緩衝,這將在過程中返回-1。如果你只用1個字節的'ReadLine'或'Read',它就可以正常工作,而且你不會遇到緩衝問題。 – atlaste 2014-08-06 14:16:06