RX需要帮助:将System.Diagnostics.Process.OutputDataReceived转换为Observable

RX需要帮助:将System.Diagnostics.Process.OutputDataReceived转换为Observable

问题描述:

我想启动一个子进程并观察它的重定向输出。在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

所以,我觉得,我的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