说明async/await和Reactive(Rx)扩展范例之间区别的代码示例?

问题描述:

这两个系统。 Reactive extension for .NETnew C# 5.0 (.NET 4.5) async/await追求(或基于)范式(方法)。说明async/await和Reactive(Rx)扩展范例之间区别的代码示例?

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

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

更新:
嗯,让我重新制定,如果这个问题似乎是前回答。
为什么要在使用本机.NET时添加并开始使用.NET的Reactive(Rx)扩展Iobservable/IObserver + await/async

什么是可能的例子,从Rx中可以看出,在没有Rx的情况下做同样的更笨拙或效率更低(即只参与本地.NET Iobservable/IObserver + await/async方法)会是什么?

+0

你甚至用google吗?显示没有表明你有。 – fredrik 2013-04-08 10:36:37

+0

@fredrik,我应该如何证明谷歌SERP结果不存在? – 2013-04-08 10:39:07

+1

只要说出你已经搜索过的东西,它没有产生任何结果。对我来说,这将表明你至少已经尝试过。 – fredrik 2013-04-08 10:43:45

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

Rx(并通过代理IObserver<T>/IObservable<T>接口)是可观察序列的范例。就像同步方法可以返回一个值(int)一样,它也可以返回一个值为IEnumerable<int>的值。将它与异步世界进行比较,Task<int>可以返回一个值intIObservable<int>可以返回一个只有一个int值的序列。因此,如果您想要返回Task<T>的值序列,则必须创建某种类型的延续,或返回值集合/数组/列表,例如TTask<int[]>。然而,这将意味着你得到所有或不是这些值。

Task/Task<T>也是一个具体类型,其中Rx使用接口来从实现中抽象出你。我发现这有助于单元测试。但是,使用任务进行测试时,可以有助于避免隐式并发。最后,除了Rx处理值序列(而不是单个值)的主要区别之外,Rx还设计为与LINQ一起使用,以提供查询和组合好处,它似乎与序列(在休息像IEnumerable<T>,或运动像IObservable<T>)。

最终,这些对于略有不同的工作是不同的工具。有一些重叠,所以你有时可以用一个来做另一个更好的。具体来说,我认为Task在组合异步工作单元时更好(做到这一点,然后执行此操作,然后执行此操作),其中Rx更好地组合一系列事件(发生此事件时,请使用数据执行此操作从这个其他事件)。

+0

对于多个值,您不需要'任务',您可以使用'Task >',您也可以使用'INotifyCollectionChanged'接口。 – 2016-04-19 07:52:32

+0

正如指出的那样:“返回一个集合/数组/列表的值..”。讨论不是关于事件(更接近于RX),而是关于'Rx'和'Task'之间的比较。添加事件,APM,线程,回调函数和其他异步样式会导致非常大的讨论,甚至是一本书。;-) – 2016-04-20 04:47:20

+1

+1。还要注意它们可以很好地协同工作:'任务 .ToObservable()'创建一个只能产生最多一个结果的'IObservable ','await myObservable'允许你异步地等待可观察元素的最后一个元素。 – 2013-04-08 12:17:23

+0

@StephenCleary,你可以设法拍摄相同的(或不同的)作为答案吗? – 2013-04-08 14:24:05

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

我有我自己的拿在那里我加了第三个维度非分解性/可组合。

非可组合:

  • 单项/同步:功能
  • 多个项目/同步:迭代
  • 单项/异步:异步功能
  • 多物品/异步:可观察

可组合:

  • 单项/同步:高阶函数
  • 多个项目/同步:LINQ/ramda/java.util.stream
  • 单项/异步:未来/承诺
  • 多个项目/异步:RX观察到

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