什么是 LINQ to events 又名 RX 框架?
-
10-07-2019 - |
题
什么是 LINQ to events 又名 接收框架 又名 .NET 4.0 中的反应式扩展(但也可作为向后移植版本)?
换句话说,System.Reactive.dll 中的所有内容是做什么用的?
解决方案
.NET Rx 团队(这不是官方名称)发现任何推送序列(事件、回调)也可以被视为拉取序列(就像我们通常在访问可枚举时所做的那样)——或者它们本质上是对偶的。简而言之,观察者/可观察模式是枚举模式的对偶。
那么这种二元性有什么酷的呢?
您对拉序列(阅读声明式风格编码)所做的任何操作也适用于推序列。这里分几个方面。您可以从现有事件创建 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);
您也可以浏览这些帖子以详细了解头部和尾部。另请查看相关源代码。
其他提示
您可以在此处详细了解: http://themechanicalbride.blogspot.com/2009/07 /introducing-rx-linq-to-events.html
我第一次曝光是在这个博客上,因为我正在读他关于F#的书: http://tomasp.net/articles/reactive-ii-csevents.aspx
基本上我对它的理解是,例如,当您为鼠标移动编写事件处理程序时,您可能想要连续捕获这些事件,并且可能能够计算移动或点击的次数,但基本上,您想要以更多方式使用该信息,而不仅仅是作为事件处理程序。因此,只需将事件视为连续流。
另外,请查看此频道9视频:专家专家:Brian Beckman和Erik Meijer - 在.NET Reactive Framework(Rx)内部
从节目描述:
.NET Reactive Framework(Rx)是LINQ to的数学对偶 对象。它由一对组成 接口IObserver / IObservable 表示基于推的或可观察的, 收藏品,加上图书馆 实现的扩展方法 LINQ标准查询运算符和 其他有用的流转换 功能
我认为RX的本质是改变角度,我们用它来查看信息。当然,每一条信息都是某个过程的结果,这个过程发生在时空连续体中。传统方法适用于将过程投影到 <!>“当前<!>”时间平面,结果会丢失时间维度的详细信息。
RX与其他维度的投影一起工作,捕获时间分量,因此难怪LINQ to RX是常规LINQ的超集。