Reactive Extensions for .NET (Rx)
LINQ to Object使用IEnumerable和IEnumerator两个接口来迭代数据集。枚举器的MoveNext()方法用于从前一个元素枚举到下一个元素,而Current属性则用于检索个别的元素。这种机制采取广泛使用的简洁易懂的"拉(pull)"过程。与之还有一种对应的"推"模式:一个是可以从集合中提取数据,同时可以把数据推进同样的集合。
理论上来说,IEnumerable接口可对集合添加对象,但是由于它的阻塞性所以不能在异步操作中进行。.Net 4.0中引入了两个新的接口:IObservable和IObserver。人们可以把IObserver赋给数据集并把它作为IObservable订阅。当一项新的数据可用时,就可以通过传递IObservable来把它压进集合,接着再传给Iobserver。如下是一个简单的示例:
class Program
{
public static void Main()
{
new NumbersObservable(new[] { 2, 3, 4 }).Subscribe(new DebugObserver());
}
}
internal class AnonymousDisposable : IDisposable
{
internal Action Action { get; set; }
void IDisposable.Dispose()
{
this.Action();
}
}
class NumbersObservable : IObservable<int>
{
public NumbersObservable(IEnumerable<int> numbers)
{
this._numbers = numbers;
}
private IEnumerable<int> _numbers;
public IDisposable Subscribe(IObserver<int> observer)
{
foreach (int number in _numbers)
{
observer.OnNext(number);
}
observer.OnCompleted();
return new AnonymousDisposable { Action = () => { ; } };
}
}
class DebugObserver : IObserver<int>
{
public void OnNext(int value) { Console.WriteLine("{0}", value); }
public void OnCompleted() { Console.WriteLine("all done."); }
public void OnError(Exception ex) { Console.WriteLine("Whoops exception, I'd better throw."); throw ex; }
}
这种方法在处理事件的时候有着极大的优势。我们可以把IObserver附加到鼠标事件并对这些事件异步记录到一个集合当中。接着就可以使用LINQ来迭代数据,并进行相应的处理。要说明它在处理GUI事件的威力。上面只是一个简单的示例,Reactive Extensions实现了更多更为强大的功能,.net 3.5和.net 4.0 (最终会作为.net 4.0的一部分随VisualStudio2010一起发布)的Beta版可以在DevLabs: Reactive Extensions for .NET (Rx)下载。
另外,关于Reactive Extensions的示例,可以参看以下这个网页:
.NET 的 Reactive Extension (Rx)
关于观察者模式的介绍,可以参看这两篇文章:
Observer(观察器)
探究观察者设计模式
Reactive Extensions for .NET (Rx)相关推荐
- Reactive Extensions 相见恨晚的Rx.Net
何为Reactive Extensions(Rx) Rx是一个遵循函数式编程的类库,它引用观察者以及迭代器设计模式对可观察对象产生的数据进行异步消费.使用Rx,开发人员将使用LINQ运算符操作异步数据 ...
- Reactive Extensions简介一
在.Net 4.0中引入了两个新的接口用来实现观察者模式--IObservable和IObserver.IObservable是数据源,IObserver是观察者,观察者订阅数据源后,当新的数据产生时 ...
- Reactive Extensions(Rx) 学习
Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了"反应性宣言",在其中尝试着定义什么是反应性应用. 这样的应用 ...
- 牛刀小试:使用Reactive Extensions(Rx),对短时间内多次发生的事件限流
我之前有一篇文章介绍到了Reactive Extension这个组件,请参考下面的文章,其中有一些基本的概念和相关的链接 牛刀小试:使用Reactive Extensions(Rx),一行代码实现多线 ...
- Reactive Extensions入门(4):Rx实战
Reactive Extensions(Rx)的优点在于能够将传统的异步编程方式从支离破碎的代码调用中解放出来.传统的采用回调的异步编程方式会使得代码很零散,尤其是异步嵌套异步的时候,代码块很难管理. ...
- Reactive Extensions (Rx) 入门(5) —— Rx的事件编程③
原文:http://www.atmarkit.co.jp/fdotnet/introrx/introrx_02/introrx_02_03.html 作者:河合 宜文 合成用的方法 本章将介绍一些Rx ...
- Reactive Extensions (Rx) 入门(3) —— Rx的事件编程①
原文:http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_02.html 作者:河合 宜文 前面两章介绍了Rx的概要和安装方 ...
- Resources about Rx(Reactive Extensions)
为什么80%的码农都做不了架构师?>>> http://msdn.microsoft.com/en-us/library/hh242985(v=VS.103).aspx htt ...
- 2、Reactive Extensions for .NET(译)
本文转自:http://www.cnblogs.com/hebeiDGL/p/3405175.html 实验3-引入 .net 中的 events 到 Rx 目标:前面实验中的使用各种工厂构造方法创建 ...
最新文章
- java 多线程间通讯_JAVA多线程间通讯常用实现方法解析
- 安装XAMPP, MYSQL 启动后自动停止
- aix oracle监听配置_LINUX系统下Oracle修改默认监听端口号操作
- c语言glut打正方形,OpenGL绘制正方形并用键盘移动
- Python内置函数sorted()从入门到精通
- PHP进行AES/ECB/PKCS7 padding加密的例子(openssl)
- 【下载https协议需要的cer证书】
- 阿里云怎么启动mysql_阿里云启动mysql
- DWM1000开启后TX、RX、SFD、RXOK均不亮的原因
- Qt Qml 开发超高清 4K、8K 视频直播视频客户端
- 2018年10微型计算机接口技术,微机原理及接口技术
- 一个自动写咪蒙体的机器人,请夸我
- Ubuntu找不到wifi适配器问题及解决办法
- 修复损坏图片的c语言,免费修复损坏的JPEG照片和图像
- 表单验证设计的用户体验基本原则
- 文正机械电子工程专业课_详解 | 机械电子工程专业学习内容与就业前景
- ygo游戏王卡组_游戏王 WCS游戏王世界大会前三强卡组,淘气仙星成为比赛冠军卡组...
- 机器人暑假班招生推文_暑假班招生活动方案
- 基于Matlab火灾图像检测系统设计
- Thymeleaf了解