阿里、微众、PingCAP专家分享如何解决可观测性带来的埋点成本上升、观测数据割裂等挑战。戳 了解详情
写点什么

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

  • 2009 年 8 月 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 年 8 月 08 日 09:123384
用户头像

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

关注

评论

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

技术实践丨体验量子神经网络在自然语言处理中的应用

华为云开发者联盟

自然语言处理 量子 量子神经网络 量子模拟

项目管理100问 | 研发团队如何实现无缝协作

万事ONES

项目管理 ONES Project 研发团队

TcaplusDB君 · 行业新闻汇编(6月9日)

TcaplusDB

nosql 后端 tencentdb TcaplusDB

TcaplusDB君 | 行业新闻汇编(6月9日)

tcaplus

数据库 游戏 TcaplusDB

技术干货 | 如何实现对动态PPT的云端录制?

ZEGO即构

音视频 WebRTC RTC 即构 动态PPT录制

WorkPlus私有化「数智融合」移动平台

WorkPlus Lite

和12岁小同志搞创客开发:如何选择合适的控制器?

不脱发的程序猿

DIY 创客开发 如何选择合适的控制器?

端午 | TcaplusDB祝大家端午安康!

数据人er

数据库 nosql tencentdb TcaplusDB

只记得文件类型如何用EasyRecovery实现恢复?

淋雨

数据恢复 EasyRecovery 文件恢复 照片恢复

云小课 | 华为云KYON之私网NAT网关

华为云开发者联盟

网关 华为云 KYON企业级云网络 私网NAT网关 重叠组网

来自 Apache APISIX committer 的经验分享 —— 编程之夏专访

Apache APISIX 中国社区

后端 技术人 API 网关

GrowingIO 增长平台产研项目管理实践

GrowingIO技术专栏

项目管理 程序员 Jira growingio

ONES CTO 冯斌 | 大型团队敏捷项目管理实践与思考

万事ONES

项目管理 研发管理 团队协作 ONES 研发工具

为什么聪明的程序员会写出糟糕的代码

实力程序员

【Flutter 专题】107 图解自定义 ACEPageMenu 滑动菜单 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

联想积极参与CSMM标准制定和推广,推进中国软件产业高质量发展

科技热闻

Java 并发编程—— Executors 分析应用

Antway

6月日更

产品策略闭环是个什么环?

万事ONES

项目管理 研发管理 ONES 产品策略

开源,让程序员找回热血和激情,参与开源,为中国科技助力

陆陆通通

开源 鸿蒙 程序员

缓存与数据库的双写一致性

SH的全栈笔记

MySQL redis 缓存

WorkPlus Lite 企业级移动平台

WorkPlus Lite

可视化及时把控营运状况,助力管理效率提升80%

一只数据鲸鱼

数据可视化 智慧城市 智慧园区 三维可视化 智慧楼宇

如何解决回归任务数据不均衡的问题?

华为云开发者联盟

深度学习 模型 标签 数据不平衡 DIR

Dokcer Compose部署Nebula Graph配置文件

阿呆

配置信息

我不服!这开源项目居然才888个星!?

why技术

Java

从单体系统到微服务

escray

学习 极客时间 朱赟的技术管理课 6月日更

Java字符串池、常量池、intern的爱恨纠葛

叫我阿柒啊

Java 常量池 intern 字符串常量池

机器学习入门:多变量线性回归

华为云开发者联盟

机器学习 多变量线性回归

助力碳中和,EMQ与SAP共同构建绿色IoT解决方案

EMQ映云科技

开源 5G 碳中和 SAP 碳达峰

和12岁小同志搞创客开发:拿到一款控制器,要怎么分析?

不脱发的程序猿

DIY 创客开发 怎么分析控制器?

Python——列表元素的增删改

在即

6月日更

Techo Day 腾讯技术开放日「轻量级云开发与云应用」

Techo Day 腾讯技术开放日「轻量级云开发与云应用」

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