Events 事件和在FSharp中可观察到的

Events 事件和在FSharp中可观察到的,events,f#,observable,reactive-programming,Events,F#,Observable,Reactive Programming,工作同等/更好吗 开着 或者在事件的性质上可以观察到 从功能上看,它似乎是等价的,我想区别在于“语义”: 我们是否在边界内,在边界内,有权接触到人类的内部状态 事件 或者,我们是否认为这是一个被动的源头,一条河流从中暴露给我们 这是正确的想法吗?事件和可观察事件之间的主要区别在于它们如何处理状态和取消订阅 事件功能附加到源事件,不提供任何取消订阅的方式。如果使用有状态组合符(如),然后将多个观察者附加到结果事件,则它们都将看到相同的状态 可观察的函数构造处理管道的“规范”。将处理程序

工作同等/更好吗

  • 开着
  • 或者在事件的性质上可以观察到
从功能上看,它似乎是等价的,我想区别在于“语义”:

  • 我们是否在边界内,在边界内,有权接触到人类的内部状态 事件
  • 或者,我们是否认为这是一个被动的源头,一条河流从中暴露给我们

这是正确的想法吗?

事件和可观察事件之间的主要区别在于它们如何处理状态和取消订阅

  • 事件功能附加到源事件,不提供任何取消订阅的方式。如果使用有状态组合符(如),然后将多个观察者附加到结果事件,则它们都将看到相同的状态

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

在实践中,主要区别在于保持完整性-如果您想共享状态,可以使用
事件
模块-使用
可观察
实现相同的功能是可能的,但难度更大


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

最初的区别远不是很明显,而且(E) 事件太多了。@Nicolas这是真的。这是历史原因造成的(F#在
IObservable
存在之前就有
event
模块-也许删除它是正确的做法)。但老实说,如果.NET一开始没有特殊的“事件”,事情会变得更容易,但这是很久以前决定的:-)。