Подтвердить что ты не робот

Что такое LINQ для событий a.k.a RX Framework?

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

Другими словами, что это за материал в System.Reactive.dll для?

4b9b3361

Ответ 1

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

Итак, что круто об этой двойственности?

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

Поскольку IObservable является математическим двойником IEnumerable,.NET Rx облегчает LINQ над push-последовательностями, такими как Events, подобно LINQ over 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 title, when ever user
//presses the left button of the mouse
points.Subscribe(p => this.Title = "Location ="  
                                        + p.X + "," + p.Y);

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

Ознакомьтесь с этим набором статей

Ответ 2

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

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

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

Ответ 3

Кроме того, ознакомьтесь с этим видеороликом Канала 9: Эксперт эксперту: Брайан Бекман и Эрик Мейер - Внутри реактивной платформы .NET(Rx)

Из описания шоу:

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

Ответ 4

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

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