30

什么是 LINQ to events aka RX Framework aka Reactive Extensions in .NET 4.0(但也可作为向后移植的版本)?

换句话说,System.Reactive.dll 中的所有东西是干什么用的?

4

4 回答 4

25

.NET Rx 团队(这不是官方名称)发现任何推送序列(事件、回调)也可以被视为拉序列(就像我们在访问枚举时通常所做的那样)——或者它们本质上是 Dual。简而言之,观察者/可观察模式是枚举模式的对偶。

那么这种二元性有什么好处呢?

您对拉序列(阅读声明式编码)所做的任何事情也适用于推序列。这里有几个方面。您可以从现有事件创建 Observable,然后将它们用作 .NET 中的一等公民——即,您可以从事件创建一个 observable,并将其作为属性公开。

由于 IObservable 是 IEnumerable 的数学对偶,因此 .NET Rx 促进 LINQ 通过事件等推送序列,很像 LINQ 在 IEnumerables

它为编写新事件提供了更大的自由——您可以从一般事件中创建特定事件。

.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);

您也可以浏览这些帖子以详细了解头部和尾部。还可以查看相关的源代码。

看看这组文章

于 2009-11-17T06:49:53.143 回答
5

你可以在这里阅读更多关于它的信息:http: //themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

我的第一次接触是在这个博客上,因为我正在阅读他关于 F# 的书:http: //tomasp.net/articles/reactive-ii-csevents.aspx

基本上我对它的理解是,例如,当您为鼠标移动编写事件处理程序时,您可能希望连续捕获这些事件,并且也许能够计算有多少移动或点击,但是,基本上,您想使用它以更多方式提供信息,而不仅仅是作为事件处理程序。因此,只需将事件视为连续流。

于 2009-08-01T20:18:29.747 回答
4

另外,请查看此第 9 频道视频:专家对专家:Brian Beckman 和 Erik Meijer - Inside the .NET Reactive Framework (Rx)

从节目描述来看:

.NET Reactive Framework (Rx) 是 LINQ to Objects 的数学对偶。它由一对表示基于推送或可观察的集合的接口 IObserver/IObservable 以及实现 LINQ 标准查询运算符和其他有用的流转换功能的扩展方法库组成。

于 2009-08-05T01:18:55.450 回答
4

我认为 RX 的本质是改变我们看待信息的角度。自然,每条信息都是某个过程的结果,这些过程发生在时空连续体中。传统方法将过程投影到“当前”时间平面,结果丢失了时间维度的细节。

RX 与其他维度的投影一起工作,同时捕获时间分量,因此难怪 LINQ to RX 是常规 LINQ 的超集。

于 2010-01-25T02:59:46.163 回答