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