. net和新c# 5.0的响应式扩展。. NET 4.5) async/await
追求(或基于)未来和承诺构建范式(方法)。
你能给(*)最简单的c#代码示例来说明它们之间的区别吗?
(*)没有I/O、互联网或数据库连接是否可能?
更新:
好吧,让我重新表述一下这个问题,如果这个问题之前似乎已经得到了回答。为什么要在使用。net原生的。net Iobservable/IObserver + await/async的同时,为。net添加并开始使用Reactive (Rx)扩展呢?
在没有Rx的情况下(即只使用原生的。net Iobservable/IObserver + await/async方法),Rx中可能缺少的东西是什么?
Future/Promise范例通常用于在将来返回单个值。可能需要一些繁重的计算或IO,因此不能保证及时同步返回。
Rx(以及代理IObserver<T>
/IObservable<T>
接口)是可观察序列的范例。正如同步方法可以返回单个值(int)一样,它也可以返回具有一个值的IEnumerable<int>
。与异步世界相比,Task<int>
可以返回单个int
值,IObservable<int>
可以返回只有一个int
值的序列。
所以如果你想用Task<T>
返回一个值序列,你必须要么创建某种延续,要么返回一个集合/数组/值列表作为T
,例如Task<int[]>
。但是,这将意味着您将获得所有值或不获得值。
Task
/Task<T>
也是一个具体类型,其中Rx使用接口将您从实现中抽象出来。我发现这对单元测试很有帮助。然而,TaskCompletionSource<T>
在测试任务时可以帮助避免隐式并发。
最后,除了Rx处理值序列(而不是单个值)的主要区别之外,Rx还被设计为与LINQ一起工作,以提供查询和组合的好处,这些好处似乎可以很好地处理序列(无论是像IEnumerable<T>
那样的静态,还是像IObservable<T>
那样的动态)。
最终,这些是不同的工具,用于略有不同的工作。有一些重叠,所以你有时可以用一个来做另一个更擅长的事情。具体来说,我认为Task
更擅长将异步工作单元组合在一起(做这个,然后做那个,然后做这个),而Rx更擅长将事件序列组合在一起(当此事件发生时,使用来自其他事件的数据执行此操作)。
它们并不相互排斥。主要的决定因素是你是有一个未来的结果还是多个未来的结果。
http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspxhttp://blogs.msdn.com/cfs - filesystemfile.ashx/__key/communityserver博客-组件- weblogfiles/00 - 00 - 01 - 31 - 75 metablogapi/0815.image_5f00_thumb_5f00_59bba077.png
我喜欢react文档中的表格:http://reactivex.io/intro.html
我有我自己的看法,我添加了一个第三维度的不可组合/可组合。
<>之前Non-composable:|单品|多品------|----------------|----------------Sync | Function | IterableAsync | Async函数| Observable可组合:|单品|多品------|-----------------------|----------------------------Sync |高阶函数| Linq/Ramda/java.util.streamAsync | Future/promise | Rx可观察对象之前请注意,根据实现的不同,你可以有同步或异步的future和rx可观察对象,这取决于你想对它们做的是同步还是异步