Команда .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);
Вы также можете пройти через эти сообщения, чтобы получить подробные сведения о голове и хвосте. Также взгляните на исходный код ссылки.
Проверьте этот набор статей