2013-03-21 69 views
19

可觀察是否當量/不如在Event type 事件及FSharp

  • 或可觀察工作

    功能似乎等同,我猜這個區別是'語義':

    • 我們是否在邊界內部有權訪問事件的內部狀態 ?
    • 或者,我們考慮這個event interface爲被動源從中流暴露給我們

    是正確的思維?

  • 回答

    22

    EventObservable之間的主要區別在於它們如何處理狀態和取消訂閱。

    • 事件功能附加到源事件,不給你任何退訂方式。如果你使用有狀態的組合器(如Event.scan),然後將多個觀察者附加到結果事件中,那麼他們將看到相同的狀態。

    • 可觀察函數構造處理管道的「規範」。當您將一個處理程序附加到IObservable值時,您會收回一個IDisposable,該值可用於刪除所有處理程序。與IObservable相連的每個處理程序都將獲得一個新狀態(因爲運行時根據「規範」創建了一個新的處理鏈)。

    在實踐中,主要的區別是在statfullness - 如果你想分享的狀態,您可以使用Event模塊 - 實現相同的使用Observable是可能的,但更難。

    如果您使用內async事件,那麼你應該使用ObservableAwaitObservable(而不是內置AwaitEvent),因爲使用事件組合程序將導致內存泄漏 - 它會附上沒有拆除事件處理程序。

    +0

    這個差距起初並不明顯,而且單詞(E)事件相當重載。 – nicolas 2013-03-21 14:27:08

    +7

    @Nicolas這是真的。它出於歷史原因(F#在'IObservable'存在之前有'Event'模塊 - 也許正確的是刪除它)。但說實話,如果.NET首先沒有特殊的「事件」,事情就會變得更加容易,但這已經在很久以前就已經決定了:-)。 – 2013-03-21 16:56:35