c# - 为什么在没有 .NET 的 Reactive(Rx) 扩展的情况下不能使用 IObservable<T>?

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

试图理解why and when I would need为 .NET 使用 Reactive Extension (Rx),我开始质疑“C# 5.0 async/await feature and Rx - Reactive Extensions”,阅读它及其引用资料导致的问题多于答案。

后文中引用Task vs IObservable: when to use what?似乎是指 IObservable 的用法与 Reactive (Rx) extensions for .NET 的用法同义(或可互换)

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

Your code will require the reactive extensions if you chose to return IObservable

想说什么?

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

RX在讨论Task<T>时要做什么与 IObservable 相比?
为什么它们的用法并列?

最佳答案

实际上是因为易于实现。您永远不应该尝试实现 IObservable<T>你自己; Rx 可以正确有效地完成您可能需要的所有实现。

Rx design guidelines指定 IObservable<T> 的实际语义.请注意, MSDN example implementation是完全错误的。

更新:

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

  • 不强制执行 Rx 语法 (4.1)。
  • 不会在 OnError 之后自动退订(4.3).
  • 可能无法正确处理极端情况(6.1、6.2)。
  • OnError没有中止语义(6.6)。
  • 如果处理订阅并重新订阅同一个观察者,则原始订阅不再是幂等的 (6.17)。

而且只有当自定义实现假定所有对 TrackLocation 的调用时才会这样。被序列化。在 Rx 世界中,几乎从来没有这种情况。

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

关于c# - 为什么在没有 .NET 的 Reactive(Rx) 扩展的情况下不能使用 IObservable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15879225/

相关文章:

c# - Roslyn 编译代码失败

c# - 默认字符串排序顺序

c# - 从 startup.cs 检查 token 有效性

c# - 如何将解决方案测试的代码覆盖率结果文件输出到解决方案目录而不是测试项目目录

c# - 捆绑和缩小返回 404

c# - 设置处理器关联性和 TPL

javascript - Prestashop 中未添加优惠券(结帐页面)

c# - 桌面应用内购买

c# - 将常量从 vb 转换为 c#

c# - 在 Parallel.For 中发送多个 WebRequest