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委托的参数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);
}
这里的关键是要Select
的EventArgs
从EventPattern/IEvent,然后抓取Data
你好! Phantastic,这个作品!非常感谢解释,现在已经很清楚了。 Rx对我来说很难;-) – mabra 2011-05-15 11:10:05
保持这种状态,它进入你的脑海 – 2011-05-15 11:20:38
最后收到的数据总是'空' - 是否有可能吞下该值,而是将observable标记为关闭? – 2016-08-12 08:25:02