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

时间:2011-05-15 03:42:35

标签: c# events system.reactive

我想启动一个子进程并观察它的重定向输出。那不是 在C#中对我来说是一个问题,但我试着理解RX,所以游戏开始...... 我有一个进程的静态扩展方法,如下所示:

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

我创建了一个observable并订阅它:

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

这并非完全错误,但我得到了:

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

虽然我期待获得字符串: - (

所以,我认为,我的extensionmethod返回了错误的类型。 如果有人可以解释我,那将是非常好的 用我的扩展方法签名。

非常感谢, ++ mabra

1 个答案:

答案 0 :(得分:2)

  

所以,我认为,我的extensionmethod返回了错误的类型

就是这样。

IEvent包含传统事件委托的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);
}

此处的关键是Select来自EventPattern / IEvent的EventArgs,然后抓住Data