2013-04-08 54 views
10

這兩個系統。 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

回答

11

未來/無極範例通常被用於在未來返回一個值。也許有一些重要的計算或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

4
+1

+1。還要注意它們可以很好地協同工作:'任務 .ToObservable()'創建一個只能產生最多一個結果的'IObservable ','await myObservable'允許你異步地等待可觀察元素的最後一個元素。 – 2013-04-08 12:17:23

+0

@StephenCleary,你可以設法拍攝相同的(或不同的)作爲答案嗎? – 2013-04-08 14:24:05

3

我喜歡錶功的文檔中:http://reactivex.io/intro.html

我有我自己的拿在那裏我加了第三個維度非分解性/可組合。

非可組合:

  • 單項/同步:功能
  • 多個項目/同步:迭代
  • 單項/異步:異步功能
  • 多物品/異步:可觀察

可組合:

  • 單項/同步:高階函數
  • 多個項目/同步:LINQ/ramda/java.util.stream
  • 單項/異步:未來/承諾
  • 多個項目/異步:RX觀察到

你得注意的是,根據實施,可以讓期貨和RX觀察量能同步或異步取決於你正在嘗試與他們做的是同步的還是 - 異步行爲都