FSharp中的事件和可观察事件

nic*_*las 19 events f# reactive-programming observable

是否相同/更好地工作

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

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

这是正确的想法吗?

Tom*_*cek 25

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

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

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

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

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

  • @Nicolas那是真的.它遵循历史原因(F#在'IObservable`存在之前有`Event`模块 - 也许正确的方法是删除它).但说实话,如果.NET首先没有特殊的"事件",事情会更容易,但这已经在很久以前决定:-). (7认同)