简体   繁体   English

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

[英]When to use Observable.FromEventPattern rather than Observable.FromEvent?

We've got a client calling off to a TIBCO EMS queue and are wiring up the events like this: 我们有一个客户端呼叫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);

When I call response.Subscribe(...) I get System.ArgumentException "Error binding to target method." 当我调用response.Subscribe(...)我得到System.ArgumentException“绑定到目标方法的错误。”

I can make it work with Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler") but then it's got the event as a string and just not as clean. 我可以使用Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")但它然后将事件作为字符串而不是干净。

Also I have IObservable<EventPattern<EMSMessageEventArgs>> rather than IObservable<EMSMessageEventArgs> 我还有IObservable<EventPattern<EMSMessageEventArgs>>而不是IObservable<EMSMessageEventArgs>

What I'd like to understand is: when should I use FromEvent over FromEventPattern ? 我想要理解的是:我何时应该使用FromEvent不是FromEventPattern It seems a bit trial and error. 这似乎有点反复试验。

"Use FromEvent for events structurally don't look like a .NET event pattern (ie not based on sender, event args), and use FromEventPattern for the pattern-based ones." “结构上使用FromEvent表示事件看起来不像.NET事件模式(即不基于发送者,事件参数),并使用FromEventPattern作为基于模式的事件。” - Bart De Smet (Rx team) - Bart De Smet(Rx团队)

To elaborate on this a bit further, you can typically determine when to choose one of the FromEvent vs FromEventPattern by the type of event used in the class you're trying to observe. 为了进一步详细说明,您通常可以确定何时从您尝试观察的类中使用的事件类型中选择FromEventFromEventPattern之一。 Use FromEventPattern when your event is of type EventHandler or the generic EventHandler<T> . 当事件的类型为EventHandler或通用的EventHandler<T>时,请使用FromEventPattern Use FromEvent when you're using a custom, non-generic event handler type. 当您使用自定义的非泛型事件处理程序类型时,请使用FromEvent The following examples are lifted directly from the Rx wiki , which has lots of good examples- 101 of them to be exact. 以下示例直接从Rx wiki中提取,其中包含许多很好的示例- 其中101个是准确的。

FromEventPattern (with generic EventHandler) : 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: 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);
    }
}

Apparently the new syntax has changed a bit. 显然,新语法有所改变。 The current syntax is the following: 目前的语法如下:

// 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(); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM