Что такое LINQ для событий a.k.a RX Framework, а также Reactive Extensions в .NET 4.0 (но также доступны как версии с резервным копированием)?
Другими словами, что это за материал в System.Reactive.dll для?
Что такое LINQ для событий a.k.a RX Framework, а также Reactive Extensions в .NET 4.0 (но также доступны как версии с резервным копированием)?
Другими словами, что это за материал в System.Reactive.dll для?
Команда .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);
Вы также можете пройти эти сообщения, чтобы подробно описать голову и хвост. Также ознакомьтесь с исходным кодом.
Подробнее об этом можно прочитать здесь: http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html
Моя первая публикация была в этом блоге, так как я читаю его книгу о F #: http://tomasp.net/articles/reactive-ii-csevents.aspx
В основном, я понимаю, что когда вы пишете обработчик событий для движений мыши, например, вы можете постоянно фиксировать эти события и, возможно, быть в состоянии подсчитать, сколько движений или кликов, но, в основном, вы хотите использовать эту информацию в большей степени, чем как обработчик событий. Итак, просто рассматривайте события как непрерывный поток.
Кроме того, ознакомьтесь с этим видеороликом Канала 9: Эксперт эксперту: Брайан Бекман и Эрик Мейер - Внутри реактивной платформы .NET(Rx)
Из описания шоу:
.NET Reactive Framework (Rx) - это математическое двойное выражение LINQ to Объекты. Он состоит из пары интерфейсов IObserver/IObservable, что представляют собой push-based или наблюдаемые, коллекции, а также библиотека методы расширения, которые реализуют Стандартные операторы запросов LINQ и другое полезное преобразование потока функции.
Я думаю, что суть RX меняет угол, с которым мы смотрим информацию. Естественно, каждая часть информации является результатом некоторого процесса, который имеет место в континууме временного пространства. Традиционный подход работает с проекцией процесса на временную плоскость "текущий" , теряя в результате детали измерения времени.
RX работает с проекцией на другое измерение, фиксируя также компонент времени, поэтому неудивительно, что LINQ to RX является надмножеством регулярного LINQ.