2011-05-15 41 views
0

我想啓動一個子進程並觀察它的重定向輸出。在C#中,我不是一個 問題,但我試着去理解RX,因此本場比賽開始...... 我有一個過程的靜態擴展方法,它看起來像這樣:RX需要幫助:將System.Diagnostics.Process.OutputDataReceived轉換爲Observable

public static IObservable<IEvent<DataReceivedEventArgs>> GetOutput(this Process that) 
    { 
     return Observable.FromEvent<DataReceivedEventArgs>(that, "OutputDataReceived"); 
    } 

我創建一個可觀察並訂閱像這樣:

Process p = ........ 
    var outObs = p.GetOutput(); 
    var outSub = outObs.Subscribe(data => Console.WriteLine(data)); 

這並不是完全錯誤的,但我得到:

System.Collections.Generic.Event`1[System.Diagnostics.DataReceivedEventArgs] 

,而我期望得到的字符串:-(

所以,我認爲,我的extensionmethod返回錯誤的類型。 這將是非常好的,如果有人能解釋我,什麼是 wong與我的擴展方法簽名。

非常感謝, ++ mabra

回答

2

所以,我覺得,我的extensionmethod返回錯誤類型

這正是它。

IEvent對傳統Event委託的參數senderEventArgs進行了包裝。所以,你需要修改代碼以看起來像

public static IObservable<string> GetOutput(this Process that) 
{ 
    return Observable.FromEvent<DataReceivedEventArgs>(that, "OutputDataReceived") 
        .Select(ep => ep.EventArgs.Data); 
} 

如果你使用的是最新的Rx,那麼代碼是不同的一點

public static IObservable<string> GetOutput(this Process that) 
{ 
     return Observable.FromEventPattern<DataReceivedEventArgs>(that, "OutputDataReceived") 
         .Select(ep => ep.EventArgs.Data); 
} 

這裏的關鍵是要SelectEventArgs從EventPattern/IEvent,然後抓取Data

+0

你好! Phantastic,這個作品!非常感謝解釋,現在已經很清楚了。 Rx對我來說很難;-) – mabra 2011-05-15 11:10:05

+1

保持這種狀態,它進入你的腦海 – 2011-05-15 11:20:38

+0

最後收到的數據總是'空' - 是否有可能吞下該值,而是將observable標記爲關閉? – 2016-08-12 08:25:02