Reactive Extensions for .NET 4.5

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

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

This entry was posted in 未分类. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s