BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

.NET反应性框架为事件实现了LINQ

| 作者 Abel Avram 关注 10 他的粉丝 ,译者 王波 关注 0 他的粉丝 发布于 2009年8月9日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Erik Meijer和Wes Dyer创建了.NET反应性框架(Reactive Framework, Rx),即利用LINQ to Object的数学对偶性,允许程序员在事件使用LINQ。Erik和Brian Beckman证实了IObservable是连续的Monad。

反应性编程并不是新事物。它早已经为Cells(一种Common Lisp的数据流扩展),和支持高阶反应性编程的Python扩展Trellis所应用。在C#中,程序员在指定异步操作指定回调,或事件处理程序的时候使用反应性编程。在异步操作完成或者事件触发的时候,就会调用方法并作为对该事件的反应。

LINQ to Object使用IEnumerable和IEnumerator两个接口来迭代数据集。枚举器的MoveNext()方法用于从前一个元素枚举到下一个元素,而Current属性则用于检索个别的元素。这种机制采取广泛使用的简洁易懂的“拉(pull)”过程。Erik还发现IEnumerable有对偶特性:一个是可以从集合中提取数据,同时可以把数据推进同样的集合。这意味着另一种反应性编程的方式。

理论上来说,IEnumerable接口可对集合添加对象,但是由于它的阻塞性所以不能在异步操作中进行。那就是为什么该团队引入了两个新的接口:IObservable和IObserver。人们可以把IObserver赋给数据集并把它作为IObservable订阅。当一项新的数据可用时,就可以通过传递IObservable来把它压进集合,接着再传给IObserver。微软展示平台控件小组的开发人员Jafar Husain解释IObserver模式的使用方法如下:

要遍历IObservable,你需要做的就是执行与IEnumerable相反的操作。创建IObserver,把它赋给IObservable,接着IObservable通过调用自身的方法来把数据压进IObserver。在IObservable对Observer调用OnUpdate方法的时候,就相当于IEnumerable方法使用关键字yield向IEnumerable传递信息。类似地,在IObservable对Observer调用OnCompleted方法的时候,就相当于IEnumerable使用关键字break来表示没有数据一样。

这样做的好处是什么呢?这种方法在处理事件的时候有着极大的优势。我们可以把IObserver附加到鼠标事件并对这些事件异步记录到一个集合当中。接着就可以使用LINQ来迭代数据,并进行相应的处理。要说明它在处理GUI事件的威力,Rx框架已经在Silverlight Toolkit单元测试中使用,并包含源代码,封装在System.Reactive.dll中。这也将会包含在.NET 4.0。

软件架构师和天文物理学家Brian Beckman在视频采访Erik Meijer时,证实了IObservable是连续的Monad,即IEnumerable Monad的对偶性。Erik也介绍了如何通过二元化IEnumerable来构建IObservable 接口。

查看英文原文:The .NET Reactive Framework (Rx) Enables LINQ over Events

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

有两个东西在国内是被低估的 by Jeffrey Zhao

IEnumerable和LINQ。好像大部分朋友总是认为这些语法上的,或者小组件有什么重要的,但是实际上就是有很多人能从中找出合适的开发模式来。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT