何时使用Observable.FromEventPattern而不是Observable.FromEvent?

我们有一个客户打电话到TIBCO的EMS队列,并接线这样的事件:

var msgConsumer = _session.CreateConsumer(responseQueue); var response = Observable.FromEvent<EMSMessageHandler,EMSMessageEventArgs> (h => msgConsumer.MessageHandler += h, h => msgConsumer.MessageHandler -= h) .Where(arg => arg.Message.CorrelationID == message.MessageID); 

当我调用response.Subscribe(...)我得到System.ArgumentException“错误绑定到目标方法”。

我可以使它与Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")但是它将事件作为一个string,而不是干净。

另外我有IObservable<EventPattern<EMSMessageEventArgs>>而不是IObservable<EMSMessageEventArgs>

我想了解的是:什么时候应该使用FromEvent覆盖FromEventPattern ? 这似乎有点反复试验。

“从结构上使用FromEvent事件看起来不像.NET事件模式(即不基于发件人,事件参数),并使用FromEventPattern模式为基础。 – Bart De Smet(Rx队)

为了进一步阐述这一点,通常可以根据您尝试观察的类中使用的事件types来确定何时selectFromEventFromEventPattern之一。 当事件types为EventHandler或genericsEventHandler<T>时,使用FromEventPattern 。 当您使用自定义的非generics事件处理程序types时,请使用FromEvent 。 下面的例子直接从Rx wiki中解放出来 ,它有很多很好的例子- 其中101个是精确的。

FromEventPattern (使用通用的EventHandler)

 class ObserveEvent_Generic { public class SomeEventArgs : EventArgs { } public static event EventHandler<SomeEventArgs> GenericEvent; static void Main() { // To consume GenericEvent as an IObservable: IObservable<EventPattern<SomeEventArgs>> eventAsObservable = Observable.FromEventPattern<SomeEventArgs>( ev => GenericEvent += ev, ev => GenericEvent -= ev ); } } 

FromEvent:

 class ObserveEvent_NonGeneric { public class SomeEventArgs : EventArgs { } public delegate void SomeNonGenericEventHandler(object sender, SomeEventArgs e); public static event SomeNonGenericEventHandler NonGenericEvent; static void Main() { // To consume NonGenericEvent as an IObservable, first inspect the type of EventArgs used in the second parameter of the delegate. // In this case, it is SomeEventArgs. Then, use as shown below. IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent( (EventHandler<SomeEventArgs> ev) => new SomeNonGenericEventHandler(ev), ev => NonGenericEvent += ev, ev => NonGenericEvent -= ev); } } 

显然新的语法已经改变了一下。 当前的语法如下:

 // get events as observable var events = Observable.FromEvent<MouseButtonEventHandler, MouseEventArgs>( handler => MouseUp += handler, handler => MouseUp -= handler); // subscribe to events var subscription = events.Subscribe(args => OnMouseUp())); // always dispose subscriptions! subscription.Dispose();