Reactive Extensions for .NET 4.5

jopen 13年前
     <p>.NET 4.5带来了新的功能,我们可以趁这个机会再来探讨一下独立的Reactive Extensions库。<a href="/misc/goto?guid=4958199936569665331">Bart De Smet</a>谈到了Rx实验分支里的情况,也提到了JavaScript和C++的Rx。</p>    <p>首先是Rx支持<a href="/misc/goto?guid=4958199937324637454">ExceptionDispatchInfo</a>。在之前版本的.NET里,捕捉异常和抛出异常的线程一般是相同的。如果库需要把它们挪到另一个线程,会通过封送回调的字段传递它们,然后通过一个泛型异常包装它们。新的异常不能隐藏下面发生的真正错误。</p>    <p>ExceptionDispatchInfo.Capture方法用于捕获异常,然后通过ExceptionDispatchInfo.Throw 在正确的线程里重新抛出。堆栈跟踪同时包括新的和原来位置的帧,并通过“End of stack trace from previous location where exception was thrown”文字分割两者。</p>    <p>Reactive Extensions创建的时候无法使用Task<T>,因为那时Task Parallel Library还不能用,即使现在,许多平台仍然不支持TPL,比如说,Silverlight。作为替代方案,Rx库是在.NET原来的异步模式上构建的。因此Observable可以通过<a href="/misc/goto?guid=4958199938064786800">Observable.FromAsyncPattern</a>方法创建。</p>    <p>由于C# 5和VB 11支持的async/await是在任务之上构建的,各个平台现在应该完全支持Task Parallel Library了。这使得Rx项目最终可以直接从Task<T>构建Observable。</p>    <p>除了任务和Observable之间的转换,Reactive Extensions还将直接支持await关键字。这会返回IObservable序列的最后一项。如果想要序列里的全部项,可以通过ToList方法把IObservable<T>转成IObservable<List<T>>。</p>    <p>另一个改变是替换了Average和ForEach等阻塞操作。举个例子,新的ForEachAsync方法将会返回一个可以等待的Task。</p>    <p>JavaScript版的RxJS将会有一个新的版本,基于Rx的当前产品版本。目前还没有时间表,但他们表示已经进入完善阶段。Reactive Extensions组还有一个本地开发者负责C++版,暂命名为RxC。<br /> <br /> 来自:http://www.infoq.com/cn/news/2011/11/Rx-Net45</p>    <p><b>查看英文原文:</b><a href="/misc/goto?guid=4958199938803976022">Reactive Extensions for .NET 4.5</a></p>