腾讯亿级用户规模自研业务的上云实践解读,立即报名 了解详情
写点什么

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

  • 2009-08-08
  • 本文字数:1092 字

    阅读完需:约 4 分钟

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

2009-08-08 09:123443
用户头像

发布了 87 篇内容, 共 18.8 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

Qt | 关于Qt Creator打开项目编译不过的问题

YOLO.

qt 7月月更

续上,Python爬虫在 fiddler 中调用本地 JS 代码文件

梦想橡皮擦

Python 爬虫 7月月更

YonBuilder赋能创新,用友第四届开发者大赛“金键盘奖”开启竞逐!

科技热闻

通过14个入门实战案例教大家快速学习Python编程语言

小院里的霍大侠

Python Python初学者 程序员‘ 编程入门 兴趣编程

字节前端面试题总结

buchila11

前端面试

深入理解MySQL主从复制原理以及集群部署过程

jiangxl

MySQL 数据库 运维 dba 签约计划第三季

数据分析如何解决商业问题?这里有份超详细攻略

博文视点Broadview

OpenAtom OpenHarmony分论坛,今天14:00见!附大事记精彩发布

OpenHarmony开发者社区

OpenHarmony

什么是私域流量?

源字节1号

软件开发

web前端技术前景如何?

小谷哥

缓存一致性与内存屏障

蝉沐风

volatile 内存屏障 缓存一致性 MESI

Java 多商户外贸版 PC 端功能,出场就是这么硬核!

CRMEB

Java——AOP案例之测量业务层接口执行效率

王小凡

Java 程序员 apo

音乐体验天花板!14个网易云音乐的情感化设计细节

张姣发

创新 交互设计 网易云音乐

C# 窗体应用常用基础控件讲解(适合萌新)

IC00

C# 7月月更

一骑入秦川——浅聊Beego AutoRouter是如何工作

Regan Yue

Go 源码刨析 Go web 签约计划第三季 Beego

语音直播系统——开发推送通知需要遵守的原则

开源直播系统源码

如何使用TDengine Sink Connector?

TDengine

tdengine Kafk

学习Typescript(一)

bo

前端 ts 7 月月更

Snowflake vs. Databricks谁更胜一筹?2022年最新战报

雨果

数据中台 数据平台 snowflake DaaS数据即服务 Databricks

es6 class 继承的重点

掘金安东尼

JavaScript 前端 ES6 7月月更

WEB服务如何平滑的上下线

转转技术团队

nginx Java web

华硕无双,这可能是屏幕最好的平价高刷轻薄笔记本

科技热闻

尚硅谷Elasticsearch8.X视频教程

小谷哥

.NET反应性框架为事件实现了LINQ_.NET_Abel Avram_InfoQ精选文章