2011-06-24 29 views
47

我們有一個客戶叫開了個TIBCO EMS隊列,並連線了這樣的事件:「錯誤與靶法」何時使用Observable.FromEventPattern而不是Observable.FromEvent?

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?這似乎有點反覆試驗。

+1

還有其他重載的FromEventPattern沒有字符串參數,如果這是你關心的。 –

+0

謝謝,我錯過了過載。是的字符串打擾了我,但它更多的是我的FromEvent和FromEventPattern之間的區別(請參閱下面的回答評論) – baralong

+0

請參閱http://stackoverflow.com/questions/19895373/how-to-use-observable-fromevent-而不是fromeventpattern-and-avoid-string-lit也可以完全解釋FromEvent。 –

回答

60

「結構上使用FromEvent事件看起來不像.NET事件模式(即不基於發件人,事件參數),並且使用FromEventPattern作爲基於模式的事件。」 - Bart De Smet (Rx team)

+11

謝謝,我發現了這個評論,但我想我誤解了它的含義。說出來是否正確?如果事件與使用FromEventPattern的事件相匹配(更詳細但可能更清晰),則.NET事件模式具有委託void Handler(對象發件人,EventArgs參數)的簽名 – baralong

+1

@baralong,沒錯。乾杯! –

11

若要進一步闡述此問題,您可以通過您試圖觀察的課程中使用的事件類型來確定何時選擇FromEventFromEventPattern之一。當您的事件類型爲EventHandler或通用EventHandler<T>時,請使用FromEventPattern。當您使用自定義非通用事件處理程序類型時,請使用FromEvent。 以下示例直接從Rx wiki中提取,它有很多很好的示例 - 101 of them

FromEventPattern(與一般的事件處理程序)

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); 
    } 
} 
+1

這是一個非常好的解釋。謝謝 –

6

顯然新的語法已經改變了一點。當前的語法如下:

// 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(); 
相關問題