2010-10-02 30 views
8

此問題已被問過不止一次,但在任何這些討論中我都沒有找到滿意的答案。如何在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(這些是迄今爲止我發現的唯一的)。有誰知道這樣的野獸是否存在?

+0

糟透了,你從來沒有得到這個問題的好回答... – 2011-07-11 21:44:45

+0

是的。我最終獲得了外部命令的源代碼,並用顯式STDOUT緩衝區刷新重新編譯它。不過,我仍然想解決原來的問題。我玩弄了自己編寫的.Net Expect實現,但重新編譯外部工具似乎是避免讓我的老闆對我大吼的更好方法。 – 2011-07-20 17:42:00

+0

我一直在努力解決同樣的問題。我正在讀取控制檯輸出在一個單獨的線程(或實際2:1的標準錯誤,1爲標準輸出)。事實證明,StandardOutput只在使用像Peek這樣的調用時纔會緩衝,這將在過程中返回-1。如果你只用1個字節的'ReadLine'或'Read',它就可以正常工作,而且你不會遇到緩衝問題。 – atlaste 2014-08-06 14:16:06

回答

1

「[我有沒有辦法啓動它,以至於它沒有意識到它正在被重定向?」是的:這正是Expect的領域。我知道沒有.Net的實現;這當然是可行的,雖然...

+0

由於Windows在內部工作的方式非常具有挑戰性! (嗯,不是在Unix上的Mono,你可以訪問真正的虛擬終端,但這是另一回事。)期待Windows使用某種時髦的調試模式,使其全部工作,而AIUI是一個非常嚴重的黑客攻擊。在子進程中使用實際的'expect'本身(運行'unbuffer'腳本)可能會更容易;是的,它使部署變得更加困難,但它確實有很好的工作機會。除了telnet。exe';這是一個特殊的(和非常糟糕的)案例。 – 2010-11-16 09:46:29