2012-01-06 37 views
2

Rx Wiki的101 Rx样本中有几个样本实际上不再工作。我认为这是因为我有最新的Rx版本(1.0.10621.2),但我想确认一下,看看如何让他们工作。突破性变化破坏了Rx样本

例如,以下示例代码不工作:

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 => GenericEvent的+ = EV” 导致了“无法隐式转换型System.Action<xxx>System.EventHandler<xxx>错误。

回答

3

你在这种情况下,几个选项。第一个是提供一种与标准事件处理程序模式(所得可观察是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 
); 

一个以上替代移动所述源/发送者对象的处理,以该观察(使可观察到的IObservable<EventPattern<SomeEventArgs>>型的)是使用FromEventPattern方法。我已经受够了这种方法稍微麻烦一些版本,所以你的里程可能会有所不同,但在这里是另类:

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

希望这有助于一点。

3

FromEvent扩展方法已被重命名为FromEventPattern所以这样做和101样本应该工作。

令人困惑的是,为非标准事件创建了一个新的FromEvent重载。他们应该叫它FromEventAction但他们没有。