Reactive Extensions for .NET 4.5

jopen 13年前發布 | 13K 次閱讀 .NET

.NET 4.5帶來了新的功能,我們可以趁這個機會再來探討一下獨立的Reactive Extensions庫。Bart De Smet談到了Rx實驗分支里的情況,也提到了JavaScript和C++的Rx。

首先是Rx支持ExceptionDispatchInfo。在之前版本的.NET里,捕捉異常和拋出異常的線程一般是相同的。如果庫需要把它們挪到另一個線程,會通過封送回調的字段傳遞它們,然后通過一個泛型異常包裝它們。新的異常不能隱藏下面發生的真正錯誤。

ExceptionDispatchInfo.Capture方法用于捕獲異常,然后通過ExceptionDispatchInfo.Throw 在正確的線程里重新拋出。堆棧跟蹤同時包括新的和原來位置的幀,并通過“End of stack trace from previous location where exception was thrown”文字分割兩者。

Reactive Extensions創建的時候無法使用Task<T>,因為那時Task Parallel Library還不能用,即使現在,許多平臺仍然不支持TPL,比如說,Silverlight。作為替代方案,Rx庫是在.NET原來的異步模式上構建的。因此Observable可以通過Observable.FromAsyncPattern方法創建。

由于C# 5和VB 11支持的async/await是在任務之上構建的,各個平臺現在應該完全支持Task Parallel Library了。這使得Rx項目最終可以直接從Task<T>構建Observable。

除了任務和Observable之間的轉換,Reactive Extensions還將直接支持await關鍵字。這會返回IObservable序列的最后一項。如果想要序列里的全部項,可以通過ToList方法把IObservable<T>轉成IObservable<List<T>>。

另一個改變是替換了Average和ForEach等阻塞操作。舉個例子,新的ForEachAsync方法將會返回一個可以等待的Task。

JavaScript版的RxJS將會有一個新的版本,基于Rx的當前產品版本。目前還沒有時間表,但他們表示已經進入完善階段。Reactive Extensions組還有一個本地開發者負責C++版,暫命名為RxC。

來自:http://www.infoq.com/cn/news/2011/11/Rx-Net45

查看英文原文:Reactive Extensions for .NET 4.5

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!