什么是LINQ to events,又称为RX框架?

30

什么是LINQ to events, 又称作RX Framework 或者在.NET 4.0 中也叫做反应式扩展(但也有向前兼容的版本)?

换句话说,System.Reactive.dll中的所有内容都是干什么用的?

4个回答

27

.NET Rx团队(这不是官方名称)发现任何推送序列(事件、回调)也可以被视为拉取序列(我们在访问可枚举对象时通常使用的方式)- 它们具有双重性质。简而言之,观察者/可观察对象模式是枚举模式的对偶。

那么这种二元性有什么酷的地方呢?

所有 Pull 序列(声明式编码)中所做的任何操作也适用于 Push 序列。以下是一些方面。 您可以从现有事件创建 Observables,然后在 .NET 中将其用作一等公民 - 例如,您可以从事件创建一个 Observable,并将其公开为属性。

由于 IObservable 是 IEnumerable 的数学对偶,因此 .NET Rx 可以像 LINQ 针对 IEnumerables 一样便捷地对 Push 序列(如事件)使用 LINQ。

它赋予了更大的自由度来组合新事件 - 您可以从一般事件创建特定事件。

.NET Rx 引入了两个接口,IObservable 和 IObserver,“提供了使用输入和输出适配器作为事件源和汇的生产者和消费者的替代方法”,这很快就会成为以声明方式编写异步代码的事实标准。以下是一个快速示例。

//Create an observable for MouseLeftButtonDown

var mouseLeftDown=Observable.FromEvent<MouseButtonEventArgs>  
        (mycontrol,"MouseLeftButtonDown");  

//Query the above observable just to select the points
var points = from ev in mouseEvents  
                 select ev.EventArgs.GetPosition(this);  

//Show points in the window's title, when ever user
//presses the left button of the mouse
points.Subscribe(p => this.Title = "Location ="  
                                        + p.X + "," + p.Y);

您也可以阅读这些帖子,以详细了解相关信息。此外,还应查看相关源代码。

查看这一系列文章


5
在你提供的例子中,在"var points = from ev in mouseEvents"这一行中,"mouseEvents"是从哪里来的,它的类型是什么? - Marcel

6
你可以在这里了解更多信息:http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html 我第一次接触到这个是在这个博客上,因为我正在阅读他关于F#的书籍: http://tomasp.net/articles/reactive-ii-csevents.aspx 基本上,我的理解是当你写一个鼠标移动事件处理程序时,你可能希望连续捕获这些事件,并且也许能够计算移动或点击次数,但是,基本上,你想以比事件处理程序更多的方式使用这些信息。所以,只需将事件视为连续的流。

6
此外,请查看这个Channel 9 视频:专家对话:Brian Beckman 和 Erik Meijer - .NET 响应式框架(Rx)内部 从节目描述中可以看出,.NET 响应式框架(Rx)是 LINQ to Objects 的数学对偶。它由一对界面 IObserver/IObservable 组成,代表着推送型或可观察的集合,再加上一个库的扩展方法来实现 LINQ 标准查询运算符和其他有用的流转换函数。

4
我认为RX的本质是改变我们观察信息的角度。自然地,每一条信息都是某个过程的结果,在时空连续体中发生。传统方法通过将该过程投影到“当前”时间平面上来处理,由此丢失了时间维度的细节。RX则通过将其投影到其他维度来处理,同时捕获时间组件,因此不难理解为什么LINQ to RX是常规LINQ的超集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接