来自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>
错误。”
答案 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书的很多样本都被打破了:( :(太伤心了......)