说明async/await和Reactive(Rx)扩展范例之间区别的代码示例?
这两个系统。 Reactive extension for .NET和new 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方法)会是什么?
未来/无极范例通常被用于在未来返回一个值。也许有一些重要的计算或IO是必需的,因此它不能保证及时地同步返回。
Rx(并通过代理IObserver<T>
/IObservable<T>
接口)是可观察序列的范例。就像同步方法可以返回一个值(int)一样,它也可以返回一个值为IEnumerable<int>
的值。将它与异步世界进行比较,Task<int>
可以返回一个值int
,IObservable<int>
可以返回一个只有一个int
值的序列。因此,如果您想要返回Task<T>
的值序列,则必须创建某种类型的延续,或返回值集合/数组/列表,例如T
。 Task<int[]>
。然而,这将意味着你得到所有或不是这些值。
Task
/Task<T>
也是一个具体类型,其中Rx使用接口来从实现中抽象出你。我发现这有助于单元测试。但是,使用任务进行测试时,可以有助于避免隐式并发。最后,除了Rx处理值序列(而不是单个值)的主要区别之外,Rx还设计为与LINQ一起使用,以提供查询和组合好处,它似乎与序列(在休息像IEnumerable<T>
,或运动像IObservable<T>
)。
最终,这些对于略有不同的工作是不同的工具。有一些重叠,所以你有时可以用一个来做另一个更好的。具体来说,我认为Task
在组合异步工作单元时更好(做到这一点,然后执行此操作,然后执行此操作),其中Rx更好地组合一系列事件(发生此事件时,请使用数据执行此操作从这个其他事件)。
对于多个值,您不需要'任务
正如指出的那样:“返回一个集合/数组/列表的值..”。讨论不是关于事件(更接近于RX),而是关于'Rx'和'Task'之间的比较。添加事件,APM,线程,回调函数和其他异步样式会导致非常大的讨论,甚至是一本书。;-) – 2016-04-20 04:47:20
它们并不相互排斥。主要的决定是你是否有单一的未来结果或多个未来结果。
http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx
+1。还要注意它们可以很好地协同工作:'任务
@StephenCleary,你可以设法拍摄相同的(或不同的)作为答案吗? – 2013-04-08 14:24:05
我喜欢表功的文档中:http://reactivex.io/intro.html
我有我自己的拿在那里我加了第三个维度非分解性/可组合。
非可组合:
- 单项/同步:功能
- 多个项目/同步:迭代
- 单项/异步:异步功能
- 多物品/异步:可观察
可组合:
- 单项/同步:高阶函数
- 多个项目/同步:LINQ/ramda/java.util.stream
- 单项/异步:未来/承诺
- 多个项目/异步:RX观察到
你得注意的是,根据实施,可以让期货和RX观察量能同步或异步取决于你正在尝试与他们做的是同步的还是 - 异步行为都
你甚至用google吗?显示没有表明你有。 – fredrik 2013-04-08 10:36:37
@fredrik,我应该如何证明谷歌SERP结果不存在? – 2013-04-08 10:39:07
只要说出你已经搜索过的东西,它没有产生任何结果。对我来说,这将表明你至少已经尝试过。 – fredrik 2013-04-08 10:43:45