我想启动一个子进程并观察它的重定向输出。那不是 在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
答案 0 :(得分:2)
所以,我认为,我的extensionmethod返回了错误的类型
就是这样。
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);
}
此处的关键是Select
来自EventPattern / IEvent的EventArgs
,然后抓住Data