19

既是系统。.NET 的响应式扩展新的 C# 5.0 (.NET 4.5)async/await追求(或基于)未来并承诺构造范例(方法)。

你能给出 (*) 最简单的 C# 代码示例来说明它们之间的区别吗?

(*)
没有 I/O、互联网或数据库连接是否可行?

更新:
好吧,如果这个问题似乎以前得到了回答,让我重新表述一下。
为什么要在使用本机 .NET Iobservable / IObserver + await/async的同时添加并开始使用 .NET 的 Reactive (Rx) 扩展?

有哪些可能的说明来说明 Rx 会缺少什么,导致在没有 Rx 的情况下做同样的事情更笨拙或效率更低(即只使用原生 .NET Iobservable/IObserver + await/async 方法)?

4

3 回答 3

18

Future/Promise 范式通常用于在将来返回单个值。也许需要一些繁重的计算或 IO,因此不能保证及时同步返回。

Rx(以及代理IObserver<T>/IObservable<T>接口)是可观察序列的范例。正如同步方法可以返回单个值(int)一样,它也可以返回IEnumerable<int>一个值。将此与异步世界进行比较,Task<int>可以返回单个int值,IObservable<int>可以返回只有一个int值的序列。

因此,如果您想返回一系列值Task<T>,则必须创建某种延续,或者将值的集合/数组/列表作为Teg返回Task<int[]>。然而,这将意味着您获得所有或非所有值。

Task/Task<T>也是一个具体类型,因为 Rx 使用接口将您从实现中抽象出来。我发现这有助于单元测试。TaskCompletionSource<T>然而,在测试任务时有助于避免隐式并发。

最后,除了 Rx 处理值序列(而不是单个值)的主要区别之外,Rx 还被设计为与 LINQ 一起使用,以提供似乎与序列很好地工作的查询和组合优势(无论是静止的IEnumerable<T>,或像运动一样IObservable<T>)。

最终,这些是用于略有不同工作的不同工具。有一些重叠,所以你有时可以用一个来做另一个更擅长的事情。具体来说,我认为Task更好地组合异步工作单元(执行此操作,然后执行此操作,然后执行此操作),而 Rx 更擅长将事件序列组合在一起(当此事件发生时,使用来自这另一个事件)。

于 2013-04-09T11:33:49.670 回答
5

我喜欢 Reactive 文档中的表格:http ://reactivex.io/intro.html

我对它有自己的看法,我添加了第三维不可组合/可组合。

不可组合:

       | 单品 | 多个项目
 ------|----------------|----------------
 同步 | 功能 | 可迭代
 异步 | 异步函数 | 可观察的

可组合:

       | 单品 | 多个项目
 ------|-----------|-------- ---------
 同步 | 高阶函数 | Linq/Ramda/java.util.stream
 异步 | 未来/承诺 | Rx 可观察的

请注意,根据实现,您可以拥有可以同步或异步操作的期货和 rx 可观察对象,具体取决于您尝试对它们执行的操作是同步的还是异步的

于 2016-11-23T13:45:43.023 回答
4

它们并不相互排斥。主要的决定是你是否有一个单一的未来结果或多个未来的结果。

http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx

http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-31-75-metablogapi/0815.image_5F00_thumb_5F00_59BBA077.png

于 2013-04-08T11:12:47.510 回答