Реактивные расширения

Реактивные расширения (Rx) — это библиотека для создания асинхронных программ и программ на основе событий с помощью наблюдаемых последовательностей и операторов запросов в стиле LINQ.

Последовательности данных могут принимать различные формы, например поток данных из файла или веб-службы, запросы веб-служб, системные уведомления или ряд событий, таких как ввод данных пользователем.

Реактивные расширения представляют все эти последовательности данных как отслеживаемые последовательности. Приложение может подписаться на эти наблюдаемые последовательности для получения асинхронных уведомлений по мере поступления новых данных. Библиотека Rx доступна для разработки классических приложений в .NET. Он также выпущен для Silverlight, Windows Phone 7 и JavaScript. Дополнительные сведения об этих платформах см. в разделе Различия между версиями Rx .

Извлечение и отправка данных

В интерактивном программировании приложение активно опрашивает источник данных для получения дополнительных сведений, извлекая данные из последовательности, представляющей источник. Такое поведение представлено шаблоном итератора IEnumerable<T>/IEnumerator<T>. Интерфейс IEnumerable<T> предоставляет один метод GetEnumerator(), который возвращает IEnumerator<T> для итерации по этой коллекции.  IEnumerator<T> позволяет получить текущий элемент (возвращая свойство Current) и определить, есть ли дополнительные элементы для итерации (путем вызова метода MoveNext). 

Приложение активно в процессе извлечения данных: помимо получения перечислителя путем вызова GetEnumerator оно также управляет скоростью извлечения, вызывая Метод MoveNext по своему усмотрению. Этот шаблон перечисления является синхронным, что означает, что приложение может быть заблокировано при опросе источника данных. Такой шаблон вытягивания похож на посещение библиотеки и проверку книги. После того как вы закончите с книгой, вы наплатите еще один визит, чтобы проверка из другой.

С другой стороны, в реактивном программировании приложению предоставляется дополнительная информация, подписавшись на поток данных (называемый наблюдаемой последовательностью в Rx), и любое обновление передается ему из источника. Приложение является пассивным в процессе извлечения данных: помимо подписки на наблюдаемый источник, оно не активно опрашивает источник, а просто реагирует на передачу данных в него. Если в потоке больше нет данных, которые можно было бы предложить или когда он возникает с ошибкой, источник отправит уведомление подписчику. Таким образом, приложение не будет заблокировано, ожидая обновления источника.

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

Модель отправки, реализованная Rx, представлена наблюдаемым шаблоном IObservable<T>/IObserver<T>. Интерфейс IObservable<T> является двойником знакомого интерфейса IEnumerable<T> . Он абстрагирует последовательность данных и хранит список реализаций IObserver<T> , интересующихся последовательностью данных. IObservable автоматически уведомляет всех наблюдателей о любых изменениях состояния. Чтобы зарегистрировать интерес через подписку, используйте метод Subscribe объекта IObservable, который принимает IObserver и возвращает IDisposable. Это дает возможность отслеживать и удалять подписку. Кроме того, реализация LINQ в Rx над наблюдаемыми последовательностями позволяет разработчикам создавать сложные запросы на обработку событий с помощью последовательностей на основе push-уведомлений, таких как события .NET, вычисления на основе APM ("IAsyncResult"), вычисления на основе задач<на основе T>, API датчиков и расположений Windows 7, потоки темпоральных событий SQL StreamInsight, первоклассные события F# и асинхронные рабочие процессы. Дополнительные сведения об интерфейсах IObservable<T>/IObserver<T> см. в разделе Изучение основных интерфейсов в Rx. Руководства по использованию различных функций Rx см. в статье Использование Rx.