【问题标题】:Why cannot IObservable<T> be used without Reactive(Rx) extension for .NET?为什么 IObservable<T> 不能在没有 .NET 的 Reactive(Rx) 扩展的情况下使用?
【发布时间】:2013-03-30 13:00:55
【问题描述】:

试图了解 why and when I would need 以使用 .NET 的响应式扩展 (Rx),我开始质疑“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&lt;T&gt;IObservable&lt;T&gt; 都是我使用的 .NET 的一部分,没有任何 Rx 参考或设置。
为什么我需要响应式扩展才能返回 IObservable

在讨论 Task&lt;T&gt; 与 IObservable 时,RX 必须做什么?
为什么它们的用法并列?

【问题讨论】:

    标签: c# .net task-parallel-library system.reactive


    【解决方案1】:

    IObservable 和 IObserver 是由 Rx 团队为 Rx 创建的......他们将其放入 .NET 框架中,这样人们就可以针对该接口进行编程并在他们的库中公开 IObservable,而无需强制每个人自动要求所有 Rx 程序集,但是一旦你想用 IObservable 做一些事情,你要么必须创建类似 Rx 的类来使用它们,要么使用 Rx。

    IObservable 和 IObserver 在数学上与 IEnumerable 和 IEnumerator 是对偶的(“箭头”,即参数和返回值流动的方向,以一种巧妙的方式颠倒过来)。类似于除了 MoveNext 和 Current 之外你不能对 IEnumerable 做很多事情,并使用包装这些方法(实际上是方法和属性)的 foreach 语句,但是 LINQ 提供了适用于 IE 的各种扩展方法,Rx 提供了 IO 的扩展方法。可以在 BCL 中实现订阅,并且仅此而已,并且可能添加一个类似 foreach 的语句来为您执行此操作,但是您很快就会发现您需要其他东西的实用程序才能真正最大限度地利用IO。

    【讨论】:

      【解决方案2】:

      这实际上是由于易于实施。你永远不应该尝试自己实现IObservable&lt;T&gt;; Rx 可以正确高效地完成所有您可能需要的实现。

      Rx design guidelines 指定IObservable&lt;T&gt; 的实际语义。请注意, MSDN example implementation 完全错误。

      更新:

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

      • 不强制执行 Rx 语法 (4.1)。
      • OnError (4.3) 之后不会自动取消订阅。
      • 可能无法正确处理角落案例(6.1、6.2)。
      • OnError 没有中止语义 (6.6)。
      • 如果一个订阅被释放并且同一个观察者被重新订阅,那么原始订阅不再是幂等的 (6.17)。

      只有当自定义实现假定所有对TrackLocation 的调用都被序列化时。在 Rx 世界中,情况几乎不是这样。

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

      【讨论】:

      • 关于为什么 MSDN 实现“完全错误”的几句话会很好:)
      • 从技术上讲,实施“完全完全”过时了。 :) 它是在 Rx 1.0 左右编写的。我们正在将所有文档移动(和更新)到 rx.codeplex.com(您还可以在其中找到整个开源 Rx 代码库)。 Stephen,感谢您指出具体问题!
      • @lindydonna,感谢您的反馈。我设法使用 Reactive Extensions (Rx) v1.0.2856.104 + SP1 但在 VS2010/.NET4.0 (Windows XP SP3) 上失败了任何 v.2.0+ 包括 those from codeplex。你有不一样的经历吗?
      • @Геннадий Ванин Новосибирск 尝试改用 NuGet 包 (blogs.msdn.com/b/rxteam/archive/2013/02/06/rx-2-1-is-here.aspx)。还可以考虑在 Win7 或更高版本上运行 VS2010,尽管您当然可以将 XP 用于您的最终应用程序。
      • 每当我尝试 Nuget 时,它都会为我提供 .NET 4.5 包。所以,我避免使用它
      猜你喜欢
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      相关资源
      最近更新 更多