Что такое LINQ для событий a.k.a RX Framework? - PullRequest
30 голосов
/ 01 августа 2009

Что такое LINQ для событий a.k.a RX Framework или Реактивные расширения в .NET 4.0 (но также доступны в виде версий с резервным копированием)?

Другими словами, для чего все компоненты System.Reactive.dll?

Ответы [ 4 ]

25 голосов
/ 17 ноября 2009

Команда .NET Rx (это не официальное название) обнаружила, что любую последовательность push (события, обратные вызовы) можно также рассматривать как последовательность извлечения (как мы обычно делаем при доступе к перечислимым объектам) - или они имеют двойную природу , Короче говоря, наблюдаемый / наблюдаемый паттерн - это двойственный паттерн перечисления.

Так что же такого в этой двойственности?

Все, что вы делаете с последовательностями Pull (читайте декларативное кодирование стиля), применимо и к последовательностям push. Вот несколько аспектов. Вы можете создавать Observables из существующих событий, а затем использовать их как первоклассных граждан в .NET, то есть вы можете создавать наблюдаемые из события и выставлять то же самое как свойство.

Поскольку IObservable является математическим двойником IEnumerable, .NET Rx облегчает LINQ для последовательностей push, таких как Events, во многом как 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);

Вы также можете пройти через эти сообщения, чтобы получить подробные сведения о голове и хвосте. Также взгляните на исходный код ссылки.

Проверьте этот набор статей

5 голосов
/ 02 августа 2009

Подробнее об этом можно прочитать здесь: http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

Мое первое знакомство было в этом блоге, когда я читаю его книгу по F #: http://tomasp.net/articles/reactive-ii-csevents.aspx

В основном я понимаю, что когда вы пишете обработчик событий для движений мыши, например, вы можете непрерывно фиксировать эти события и, возможно, иметь возможность подсчитывать, сколько движений или щелчков, но, в основном, вы хотите использовать эту информацию в большем количестве способов, чем просто в качестве обработчика событий. Поэтому просто относитесь к событиям как к непрерывному потоку.

4 голосов
/ 25 января 2010

Я думаю, что суть RX заключается в изменении угла , с которым мы смотрим на информацию. Естественно, каждый фрагмент информации является результатом какого-то процесса, происходящего в пространственно-временном континууме. Традиционный подход работает с проекцией процесса на «текущую» плоскость времени, в результате чего теряются детали измерения времени.

RX работает с проекцией в какое-то другое измерение, захватывая также временную составляющую, поэтому неудивительно, что LINQ to RX является надмножеством обычного LINQ.

4 голосов
/ 05 августа 2009

Также посмотрите это видео на канале 9: Эксперт к эксперту: Брайан Бекман и Эрик Мейер - Внутри .NET Reactive Framework (Rx)

Из описания выставки:

.NET Reactive Framework (Rx) - это математический двойник LINQ для Объекты. Он состоит из пары интерфейсы IObserver / IObservable, что представляют толчок, или наблюдаемый, коллекции, а также библиотека методы расширения, которые реализуют Стандартные операторы запросов LINQ и другое полезное преобразование потока функции.

...