20

是否等效/更好地工作

从功能上看,它似乎是等效的,我想区别在于“语义”:

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

这是正确的想法吗?

4

1 回答 1

28

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

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

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

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

如果你在里面使用事件async,那么你应该使用Observableand AwaitObservable(而不是内置的AwaitEvent),因为使用事件组合器会泄漏内存——它会附加永远不会删除的事件处理程序。

于 2013-03-21T14:08:43.773 回答