需要有关 RX:Convert System.Diagnostics.Process.OutputDataReceive



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

    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]

虽然我希望得到字符串:-(

所以,我认为,我的扩展方法返回错误的类型。如果有人能解释我,那就太好了,是什么用我的扩展方法签名。

多谢++马布拉

所以,我认为我的扩展方法返回错误的类型

就是这样。

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);
}

这里的关键是从 EventPattern/IEvent Select EventArgs,然后获取Data

相关内容

  • 没有找到相关文章

最新更新