为什么IObservable无需响应式(Rx)扩展即可使用.net

本文关键字:Rx 扩展 net 可使用 响应 IObservable 为什么 | 更新日期: 2023-09-27 18:08:07

试图理解为什么以及何时需要在。net中使用响应式扩展(Rx),我提出了一个问题"c# 5.0 async/await特性和Rx -响应式扩展",阅读它的参考文献导致更多的问题而不是答案。

后一篇文章中提到的Task vs IObservable:何时使用什么?似乎是指IObservable的使用与。net的响应式(Rx)扩展的使用同义(或互换)

例如,文章中的短语

如果你选择返回,你的代码将需要响应式扩展IObservable

想说什么?

Task<T>IObservable<T>都是。net的一部分,我在没有任何参考或设置Rx的情况下使用。
为什么我需要活性扩展来重新启用IObservable ?

在讨论Task<T>和IObservable时,RX必须做什么?
为什么它们的用法是并列的?

为什么IObservable<T>无需响应式(Rx)扩展即可使用.net

这实际上是由于易于实现。你不应该尝试自己实现IObservable<T>;

Rx设计指南指定了IObservable<T>的实际语义。请注意MSDN示例实现是完全错误的。

更新:

MSDN示例代码在以下语义中失败(参考编号是上面引用的文档中的设计指南):

  • 不强制Rx语法(4.1)。
  • OnError(4.3)之后不自动退订。
  • 可能无法正确处理转角情况(6.1,6.2)。
  • OnError没有abort语义(6.6)。
  • 如果一个订阅被解除,并且同一个观察者被重新订阅,那么原来的订阅不再是幂等的(6.17)。

只有在自定义实现假设所有对TrackLocation的调用都是序列化的情况下才会出现这种情况。在Rx世界中,这种情况几乎不存在。

请注意,使用Rx Synchronize操作符可以解决所有这些问题,尽管您仍然必须假设对TrackLocation的序列化调用。

IObservable和IObserver是Rx团队为Rx创建的…它们被纳入。net框架,这样人们就可以针对这个接口编程,并在库中公开IObservables,而不必强制每个人都自动需要所有的Rx程序集,但是一旦你想用IObservable做点什么,你要么必须创建类Rx来消费它们,要么使用Rx。

IObservable和IObserver在数学上是IEnumerable和IEnumerator的对偶("箭头",参数和返回值流动的方向,以一种聪明的方式反过来了)。类似于除了MoveNext和Current之外,你不能对IEnumerable做很多事情,并且使用foreach语句来包装这些方法(实际上是方法和属性),但是LINQ提供了各种可以在IE上工作的扩展方法,Rx为IO提供了扩展方法。在BCL中实现Subscribe(订阅)是可能的,而且只有订阅,也许还可以添加一个foreach语句来为您实现订阅,但是您很快就会发现,您需要使用其他东西来真正最大化IO的使用。