2015-08-08 77 views
3

我是新來無擴展,處理有這樣定義事件COM庫:如何正確觀察非標準事件?

public delegate void MyDelegate(int requestId, double price, int amount); 
public event MyDelegate MyEvent; 

如何正確觀察到這一點?我嘗試使用Observable.FromEvent(),但由於事件的參數不是EventArgs類型,我看不到FromEvent()FromEventPattern()將如何工作。

我目前的解決方法是將自定義委託附加到事件,然後調用Subject.OnNext(),但我猜這不是我應該這樣做。

這是我目前的解決方法的一個例子:

 MyEvent += new MyDelegate((int requestId, double price, int amount) => 
     { 
      Task.Run(() => 
      { 
       var args = new MyArgs() 
       { 
        requestId = requestId, 
        price = price, 
        amount = amount, 
       }; 
       this.mySubject.OnNext(args); 
      }); 
     }); 

回答

4

還有就是FromEvent它一個特殊的過載。這是一個有點傻傻的左右讓你的頭,但函數簽名看起來像:

IObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Func<Action<TEventArgs>, TDelegate> conversion, 
                 Action<TDelegate> addHandler, 
                 Action<TDelegate> removeHandler); 

轉換函數是這裏的重要組成部分,基本上你告訴Rx上代表映射到具體類型如何。

在你的情況下它結束了看起來像這樣:

Observable.FromEvent<MyDelegate, MyArgs>(
    converter => new MyDelegate(
        (id, price, amount) => converter(new MyArgs { 
                 RequestId = id, 
                 Price = price, 
                 Amount = amount 
                 }) 
       ), 
    handler => MyEvent += handler, 
    handler => MyEvent -= handler); 

那麼,什麼是這一切都在做什麼?在內部,它與你所做的相似(我將在概念上解釋它的作用,因爲實現稍微複雜一些)。當進行新的訂閱時,轉換函數將被調用observer.OnNext作爲converter參數傳入。這個lambda將返回一個新的MyDelegate實例,它包裝了我們提供的轉換函數((id, price, amount) => ...)。這是什麼然後傳遞給handler => MyEvent += handler方法。

之後,每次觸發事件時,它都會調用我們的lambda方法,並將傳遞的參數轉換爲MyArgs的實例,然後將其傳遞到converter/observer.OnNext。另外,對於所有這些魔法,當你完成它時,它還將負責清理事件處理程序,優雅地向下傳遞異常,並通過在多個觀察者之間共享單個事件處理程序來管理內存。 。

Source code