试图理解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/