Что такое LINQ to events, также известный как RX Framework?
-
10-07-2019 - |
Вопрос
Что такое LINQ to events, также известное как RX Фреймворк он же Реактивные расширения в .NET 4.0 (но также доступны в виде бэкпортированных версий)?
Другими словами, для чего все это в System.Reactive.dll?
Решение
Команда .NET Rx (это не официальное название) обнаружила, что любая последовательность push (события, обратные вызовы) также может рассматриваться как последовательность pull (как мы обычно делаем при доступе к перечисляемым) - или они двойственны по своей природе.Короче говоря, шаблон observer / observable - это двойственный шаблон перечисления.
Так что же классного в этой двойственности?
Все, что вы делаете с последовательностями вытягивания (читай кодирование в декларативном стиле), применимо и к последовательностям выталкивания.Вот несколько аспектов.Вы можете создавать наблюдаемые объекты из существующих событий, а затем использовать их в качестве граждан первого класса в .NET - т.Е. вы можете создать наблюдаемый объект из события и предоставить его в качестве свойства.
Поскольку IObservable является математическим двойником IEnumerable, .NET Rx облегчает LINQ над push-последовательностями, такими как события, во многом подобно 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: Эксперт-эксперт: Брайан Бекман и Эрик Мейер - Внутри .NET Reactive Framework (Rx)
Из описания шоу:
.NET Reactive Framework (Rx) - это математический двойник LINQ для Объекты. Он состоит из пары интерфейсы IObserver / IObservable, что представляют толчок, или наблюдаемый, коллекции, а также библиотека методы расширения, которые реализуют Стандартные операторы запросов LINQ и другое полезное преобразование потока функции.
Я думаю, что суть RX заключается в изменении угла , с которым мы смотрим на информацию. Естественно, каждый фрагмент информации является результатом какого-то процесса, происходящего в пространственно-временном континууме. Традиционный подход работает с проекцией процесса на «текущую» временную плоскость, в результате чего теряются детали измерения времени. Р>
RX работает с проекцией в какое-то другое измерение, также захватывая компонент времени, поэтому неудивительно, что LINQ to RX - это расширенный набор обычного LINQ.