一个代码示例示出异步/等待和无功(Rx)的延伸部的范例之间的差异?(A code example i

2019-08-20 06:44发布

这两个系统。 无扩展.NET和新的C#5.0(.NET 4.5) async/await追求(或者基于) 未来,并承诺结构范式(方法)。

你可以给(*)最简单的C#代码说明它们之间的区别的例子吗?

(*)
是否有可能没有I / O,网络或数据库连接?

更新:
好吧,让我重新制定,如果这个问题似乎是前回答。
为什么一个补充,并开始使用反应性(Rx)的扩展.NET,同时使用本地的.NET 的IObservable / IObserver + 等待/异步 ?

什么是什么人将进行的Rx缺少做做同样更笨拙或效率较低的Rx无(即只参与本机.NET的IObservable / IObserver +等待/异步方法)可能插图?

Answer 1:

未来/无极范例通常被用于在未来返回一个值。 也许有一些繁重的计算或所需,因此为什么它不能保证是及时同步返回IO。

RX(并且由代理IObserver<T> / IObservable<T>接口)是观察序列的一个范例。 正如一个同步方法可以返回一个值(INT),它也可能返回一个IEnumerable<int>一个值。 比较这一个异步的世界, Task<int>可以返回一个intIObservable<int>可以返回一个序列只有一个int值。

所以,如果你想与返回值的序列Task<T>你就必须要么建立某种形式的延续,或返回值的集合/数组/列表TTask<int[]> 然而,这将意味着你得到的值的全部或无。

Task / Task<T>也是一个具体类型,其中为Rx使用接口抽象你从实现。 我发现这在单元测试提供帮助。 TaskCompletionSource<T>与任务测试时然而可以是有益的,以避免隐式并发性。

最后,除了是R x为处理值(不是单值)的序列的主要区别中,Rx还设计有LINQ合作,提供这似乎与序列很好地工作的查询和组成的利益(无论是在静止喜欢IEnumerable<T>或在像运动IObservable<T>

最终,这些都是稍有不同的工作不同的工具。 有一些重叠,所以有时你可以使用一个做另一种是在什么好。 具体而言,我认为Task是在作曲的异步工作单位一起更好的(这样做,那么做,那么做到这一点),其中为Rx是构成事件序列一起更好的(当这个事件发生时,此功能是数据从这个其他事件)。



Answer 2:

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

我有我自己拿就可以了,其中我添加了第三个维度非分解性/可组合。

Non-composable:

       |  Single Item   | Multiple items
 ------|----------------|----------------
 Sync  | Function       | Iterable
 Async | Async function | Observable

Composable:

       |      Single Item      |       Multiple items
 ------|-----------------------|----------------------------
 Sync  | Higher order function | Linq/Ramda/java.util.stream
 Async | Future/promise        | Rx observable

你得注意的是,根据实施,可以让期货和RX观测既能同步或异步取决于你正在尝试与他们做的是同步的还是 - 异步行为



Answer 3:

他们不是相互排斥的。 主要是确定是否有未来单个结果或多个未来的结果。

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



文章来源: A code example illustrating the difference between the paradigms of async/await and Reactive (Rx) extension?