簡體   English   中英

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

[英]When to use Observable.FromEventPattern rather than 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")但它然后將事件作為字符串而不是干凈。

我還有IObservable<EventPattern<EMSMessageEventArgs>>而不是IObservable<EMSMessageEventArgs>

我想要理解的是:我何時應該使用FromEvent不是FromEventPattern 這似乎有點反復試驗。

“結構上使用FromEvent表示事件看起來不像.NET事件模式(即不基於發送者,事件參數),並使用FromEventPattern作為基於模式的事件。” - Bart De Smet(Rx團隊)

為了進一步詳細說明,您通常可以確定何時從您嘗試觀察的類中使用的事件類型中選擇FromEventFromEventPattern之一。 當事件的類型為EventHandler或通用的EventHandler<T>時,請使用FromEventPattern 當您使用自定義的非泛型事件處理程序類型時,請使用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(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM