2013-03-21 38 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