我想启动一个子进程并观察它的重定向输出。那不是在 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 包装了传统事件委托的sender
和EventArgs
参数。所以你需要修改你的代码,看起来像
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