5

试图了解为什么以及何时需要为 .NET 使用 Reactive Extension (Rx),我开始质疑“ C# 5.0 async/await feature and Rx - Reactive Extensions ”,阅读其参考文献导致的问题多于答案.

后一篇文章中提到的Task vs IObservable:when to use what?似乎是指IObservable同义词(或可互换地)使用.NET 的 Reactive (Rx) 扩展

例如,上述文章中的短语是什么意思:

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

想说什么?

两者都是 .NETTask<T>IObservable<T>一部分,我在没有任何 Rx 参考或设置的情况下使用它。
为什么我需要响应式扩展才能 retuen IObservable

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

4

2 回答 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 世界中,情况几乎从未如此。

请注意,使用 RxSynchronize运算符可以解决所有这些问题,尽管您仍然必须假设对TrackLocation.

于 2013-04-08T12:44:46.650 回答
1

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

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

于 2013-04-08T15:36:24.790 回答