突破性的变化破坏了Rx样本

时间:2012-01-06 00:29:02

标签: observablecollection system.reactive

来自Rx Wiki的101 Rx样本中的一些样本实际上不再有效。我认为这是因为我有最新的Rx版本(1.0.10621.2),但我想确认一下,看看我是如何让它们工作的。

例如,以下示例代码不起作用:

class ObserveEvent_Generic
{
    public class SomeEventArgs : EventArgs { }
    public static event EventHandler<SomeEventArgs> GenericEvent;

    static void Main()
    {
        // To consume GenericEvent as an IObservable:
        IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent<SomeEventArgs>(
            ev => GenericEvent += ev,
            ev => GenericEvent -= ev);
    }
}

缺少IEvent,“ev =&gt; GenericEvent + = ev”导致“无法隐式转换类型System.Action<xxx>System.EventHandler<xxx>错误。”

3 个答案:

答案 0 :(得分:3)

在这种情况下,您有几个选择。第一种是提供与标准EventHandler模​​式匹配的委托(结果Observable的类型为IObservable<SomeEventArgs>)。请注意我提供的lamda接受“o”(“发件人”),但不使用此参数:

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<SomeEventArgs>
(
    ev => GenericEvent += (o,e) => ev(e),
    ev => GenericEvent -= (o,e) => ev(e)
);

特别是在您的情况下(静态事件......哎呀!),我会保持信任,取消订阅会真正正确清理,并且根据使用情况,您最终可能会遇到令人讨厌的内存泄漏。作为替代方法,您可以指定委托类型。请注意FromEvent

的额外通用参数
IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<EventHandler<SomeEventArgs>, SomeEventArgs>
(
    ev => GenericEvent += ev,
    ev => GenericEvent -= ev
);

将源/发送方对象的处理移动到Observer(使IObservable<EventPattern<SomeEventArgs>>类型的可观察对象)的另一个替代方法是使用FromEventPattern方法。在某些版本中我使用这种方法有点麻烦,所以你的里程可能会有所不同,但这是另一种选择:

IObservable<EventPattern<SomeEventArgs>> eventAsObservable = 
Observable.FromEventPattern<SomeEventArgs>
(
    ev => GenericEvent += ev,
    ev => GenericEvent -= ev
);

希望这有点帮助。

答案 1 :(得分:3)

FromEvent扩展方法已重命名为FromEventPattern,因此请执行此操作,101个样本应该可以正常工作。

令人困惑的是,为非标准事件创建了新的FromEvent重载。他们应该称之为FromEventAction,但他们没有。{/ p>

答案 2 :(得分:0)

来自Programming Reactive Extensions and LINQ by Jesse Liberty and Paul Betts书的很多样本都被打破了:( :(太伤心了......)