System..NET的反应性扩展和async/await都追求(或基于) 未来与承诺范式(方法)。
您能给出(*)最简单的C#代码示例,说明它们之间的区别吗?
(*)
有没有可能没有I/O、internet或数据库连接?
更新:
好吧,如果这个问题以前似乎有人回答的话,让我重新解释一下。
为什么要为.NET添加和开始使用反应性(Rx)扩展,而使用本机.NET 可观测/IObserver + 等待/异步?
在没有Rx的情况下,Rx中有哪些可能会使人做同样的笨拙或效率更低的事情(例如,只使用原生的.NET可观测/i观察者+等待/异步方法),有哪些可能的说明?
发布于 2013-04-09 11:33:49
未来/承诺范式通常用于在未来返回一个单一的价值。可能需要一些繁重的计算或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更擅长将事件序列组合在一起(当发生此事件时,使用来自另一个事件的数据来完成此操作)。
发布于 2013-04-08 11:12:47
它们不是相互排斥的。主要的决定是你是有一个未来的结果还是多个未来的结果。
http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx
59BBA077.png
https://stackoverflow.com/questions/15876957
复制相似问题