2012-01-06 66 views
2

Rx Wiki的101 Rx樣本中有幾個樣本實際上不再工作。我認爲這是因爲我有最新的Rx版本(1.0.10621.2),但我想確認一下,看看如何讓他們工作。突破性變化破壞了Rx樣本

例如,以下示例代碼不工作:

class ObserveEvent_Generic 
{ 
    public class SomeEventArgs : EventArgs { } 
    public static event EventHandler<SomeEventArgs> GenericEvent; 

    static void Main() 
    { 
     // To consume GenericEvent as an IObservable: 
     IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent<SomeEventArgs>(
      ev => GenericEvent += ev, 
      ev => GenericEvent -= ev); 
    } 
} 

的IEvent缺失和 「EV => GenericEvent的+ = EV」 導致了「無法隱式轉換型System.Action<xxx>System.EventHandler<xxx>錯誤。

回答

3

你在這種情況下,幾個選項。第一個是提供一種與標準事件處理程序模式(所得可觀察是IObservable<SomeEventArgs>類型的)匹配委託。請注意,我提供的LAMDA接受「o」(「發件人」 ),但是這個參數不被使用:

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<SomeEventArgs> 
(
    ev => GenericEvent += (o,e) => ev(e), 
    ev => GenericEvent -= (o,e) => ev(e) 
); 

特別是在您的情況(靜態事件......讓人驚訝!),我會保持沉默相信這些退訂將真正清理正確,你可能最終取決於使用一個討厭的內存泄漏。作爲替代方案,您可以指定委託類型。這裏注意額外的通用參數來FromEvent

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<EventHandler<SomeEventArgs>, SomeEventArgs> 
(
    ev => GenericEvent += ev, 
    ev => GenericEvent -= ev 
); 

一個以上替代移動所述源/發送者對象的處理,以該觀察(使可觀察到的IObservable<EventPattern<SomeEventArgs>>型的)是使用FromEventPattern方法。我已經受夠了這種方法稍微麻煩一些版本,所以你的里程可能會有所不同,但在這裏是另類:

IObservable<EventPattern<SomeEventArgs>> eventAsObservable = 
Observable.FromEventPattern<SomeEventArgs> 
(
    ev => GenericEvent += ev, 
    ev => GenericEvent -= ev 
); 

希望這有助於一點。

3

FromEvent擴展方法已被重命名爲FromEventPattern所以這樣做和101樣本應該工作。

令人困惑的是,爲非標準事件創建了一個新的FromEvent重載。他們應該叫它FromEventAction但他們沒有。