FSharp中的事件和可观察事件

时间:2013-03-21 13:49:33

标签: events f# observable reactive-programming

是否相同/更好地工作

在功能上它看起来是等价的,我猜不同之处在于语义' :

  • 我们是否在有权访问内部状态的边界内 事件 ?
  • 或者我们是否将此event interface视为流向我们的被动来源

这是正确的想法吗?

1 个答案:

答案 0 :(得分:25)

EventObservable之间的主要区别在于它们如何处理状态和取消订阅。

  • 事件函数会附加到源事件,并且不会为您提供取消订阅的任何方式。如果您使用有状态组合器(如Event.scan)然后将多个观察者附加到结果事件,那么它们将看到相同的状态。

  • 可观察函数构造处理管道的“规范”。当您将处理程序附加到IObservable值时,您将获得可用于删除所有处理程序的IDisposable。附加到IObservable的每个处理程序将获得一个新状态(因为运行时根据“规范”创建一个新的处理链)。

在实践中,主要区别在于statfullness - 如果你想共享状态,你可以使用Event模块 - 使用Observable实现相同但可能更难。

如果您使用async内的事件,那么您应该使用ObservableAwaitObservable(而不是内置AwaitEvent),因为使用事件组合器会泄漏内存 - 它将附加从未删除的事件处理程序。