试图理解为什么以及何时需要在。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设计指南指定了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的使用。