为什么不能在.NET中使用IObservable<T>而不使用Reactive(Rx)扩展库?

5
尝试理解何时何地需要使用Reactive Extension(Rx)来进行.NET编程,我开始质疑“C# 5.0 async / await feature and Rx - Reactive Extensions”这篇文章,并阅读了其中的参考文献,结果产生了更多问题而不是答案。
后一篇文章中提到的“Task vs IObservable: when to use what?”似乎将使用IObservable与使用Reactive (Rx) extensions for .NET视为同义词(或可互换使用)。
举例来说,上述文章中的短语是什么意思?
如果你选择返回IObservable,你的代码将需要响应式扩展库。
想要表达什么? Task<T>IObservable<T>都是.NET的一部分,我在使用它们时没有引用或设置Rx。为什么我需要响应式扩展来返回IObservable
在讨论Task<T>与IObservable时,RX有什么关系?
为什么它们的使用被并置?
2个回答

13

这实际上是因为易于实现。您永远不应该尝试自己实现IObservable<T>; Rx已经正确高效地完成了每个实现。

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

更新:

MSDN示例代码在以下语义上失败(参考数字为上述文档中的设计指南):

  • 不符合Rx语法(4.1)。
  • OnError后没有自动取消订阅(4.3)。
  • 可能无法正确处理边缘情况(6.1、6.2)。
  • OnError没有中止语义(6.6)。
  • 如果订阅被处理并且重新订阅相同的观察者,则原始订阅不再具有幂等性(6.17)。

而且,这仅适用于自定义实现假设对TrackLocation的所有调用都是串行的情况。在Rx世界中,这几乎从未发生。

请注意,使用Rx的Synchronize运算符可以解决所有这些问题,但您仍然必须假设对TrackLocation的调用是串行的。


2
能够简单说明一下为什么 MSDN 的实现方式是“完全错误的”就更好了 :) - Eyvind
从技术上讲,这个实现已经“完全过时了”。 :) 它是大约在 Rx 1.0 时编写的。我们正在将所有文档移动(并更新)到 rx.codeplex.com(您也可以在那里找到整个开源 Rx 代码库)。Stephen,感谢您指出具体问题! - lindydonna
@lindydonna,感谢您的反馈。我成功地使用了Reactive Extensions (Rx) v1.0.2856.104 + SP1,但在VS2010/.NET4.0(Windows XP SP3)上无法使用v.2.0+,包括来自codeplex的版本。您有不同的经验吗? - Gennady Vanin Геннадий Ванин
@Геннадий Ванин 请尝试使用NuGet包(http://blogs.msdn.com/b/rxteam/archive/2013/02/06/rx-2-1-is-here.aspx)。同时考虑在Win7或更高版本上运行VS2010,但您可以针对XP进行最终应用程序的开发。 - lindydonna
2
每当我尝试使用Nuget时,它都会给我带来.NET 4.5的软件包。因此,我避免使用它。 - Gennady Vanin Геннадий Ванин

1
IObservable和IObserver是由Rx团队为Rx创建的...他们将其纳入.NET Framework,以便人们可以根据该接口进行编程,并在其库中公开IObservables,而无需强制每个人自动要求所有Rx程序集,但是一旦您想要实际使用IObservable,您将不得不创建类似于Rx的类来使用它们,或者使用Rx。
IObservable和IObserver在数学上是对偶的(“箭头”,参数和返回值流动的方向以巧妙的方式被颠倒)。与您不能在IEnumerable中执行太多操作除了MoveNext和Current并使用包装这些方法的foreach语句(实际上是方法和属性)类似,但LINQ提供各种扩展方法来处理IE,Rx为IO提供扩展方法。可能会在BCL中实现Subscribe,仅如此,也许添加一个类似于foreach的语句,它可以为您执行此操作,但然后您很快就会发现您需要其他工具的效用来真正最大化使用IO。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接