一个代码示例说明了异步/等待和响应式(Rx)扩展范例之间的区别



. 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.aspx

http://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可观察对象,这取决于你想对它们做的是同步还是异步

相关内容

  • 没有找到相关文章

最新更新