Изучение основных интерфейсов в Rx

В этом разделе описываются основные интерфейсы реактивных расширений (Rx), используемые для представления наблюдаемых последовательностей и подписки на них.

Интерфейсы IObservable<T>/IObserver<T> доступны в библиотеке базовых классов платформа .NET Framework 4.0 и входят в пакет, который можно установить в .NET 3.5, Silverlight 3 и 4, а также в JavaScript.

IObservable<T>/IObserver<T>

Rx предоставляет асинхронные источники данных и источники данных на основе событий как отслеживаемые последовательности на основе push-уведомлений, абстрагированные новым интерфейсом IObservable<T> в платформа .NET Framework 4.0. Этот интерфейс IObservable<T> является двойником знакомого интерфейса IEnumerable<T> , используемого для перечисляемых коллекций на основе извлечения. Он представляет источник данных, который можно наблюдать. Это означает, что он может отправлять данные всем заинтересованным лицам. Он ведет список зависимых реализаций IObserver<T> , представляющих такие заинтересованные прослушиватели, и автоматически уведомляет их об изменениях состояния.

Реализацию интерфейса IObservable<T> можно рассматривать как коллекцию элементов типа T. Таким образом, iObservable<int> можно рассматривать как коллекцию целых чисел, в которой целые числа будут отправляться подписанным наблюдателям.

Как описано в разделе Что такое Rx, другая половина модели отправки представлена интерфейсом IObserver<T> , который представляет наблюдателя, который регистрирует интерес через подписку. Элементы затем передаются наблюдателю из наблюдаемой последовательности, на которую он подписывается.

Чтобы получать уведомления из наблюдаемой коллекции, используйте метод Subscribe объекта IObservable, чтобы передать ему объект IObserver<T> . В обмен на этот наблюдатель метод Subscribe возвращает объект IDisposable, который выступает в качестве дескриптора для подписки. Это позволяет очистить подписку после завершения работы.  Вызов Dispose для этого объекта отсоединяет наблюдателя от источника, чтобы уведомления больше не доставлялись. Как можно сделать вывод, в Rx не нужно явно отменять подписку на событие, как в модели событий .NET.

Наблюдатели поддерживают три события публикации, отражаемые методами интерфейса. OnNext может вызываться ноль или более раз, если в наблюдаемом источнике данных есть доступные данные. Например, наблюдаемый источник данных, используемый для событий перемещения мыши, может отправлять объект Point при каждом перемещении мыши. Два других метода используются для указания завершения или ошибок.

Ниже перечислены интерфейсы IObservable<T>/IObserver<T> .

public interface IObservable<out T> 
{ 
   IDisposable Subscribe(IObserver<T> observer); 
} 
public interface IObserver<in T> 
{ 
   void OnCompleted();            // Notifies the observer that the source has finished sending messages.
   void OnError(Exception error); // Notifies the observer about any exception or error.
   void OnNext(T value);          // Pushes the next data value from the source to the observer.
} 

Rx также предоставляет методы расширения Subscribe, что позволяет избежать самостоятельной реализации интерфейса IObserver<T> . Для каждого события публикации (OnNext, OnError, OnCompleted) наблюдаемой последовательности можно указать делегат, который будет вызываться, как показано в следующем примере. Если не указать действие для события, будет выполняться поведение по умолчанию.

IObservable<int> source = Observable.Range(1, 5); //creates an observable sequence of 5 integers, starting from 1
IDisposable subscription = source.Subscribe(
                            x => Console.WriteLine("OnNext: {0}", x), //prints out the value being pushed
                            ex => Console.WriteLine("OnError: {0}", ex.Message),
                            () => Console.WriteLine("OnCompleted"));

Наблюдаемую последовательность (например, последовательность событий наведения указателя мыши) можно рассматривать как обычную коллекцию. Таким образом, вы можете создавать запросы LINQ по коллекции для выполнения таких действий, как фильтрация, группирование, составление и т. д. Чтобы сделать наблюдаемые последовательности более полезными, сборки Rx предоставляют множество операторов LINQ фабрики, поэтому вам не нужно реализовывать их самостоятельно. Это будет описано в статье Запрос наблюдаемых последовательностей с помощью операторов LINQ .

Предупреждение

Вам не нужно самостоятельно реализовывать интерфейсы IObservable<T>/IObserver<T> . Rx предоставляет внутренние реализации этих интерфейсов и предоставляет их с помощью различных методов расширения, предоставляемых типами Observable и Observer. Дополнительные сведения см. в разделе Создание и запрос наблюдаемых последовательностей .

См. также:

Основные понятия

Запрос наблюдаемых последовательностей с помощью операторов LINQ

Другие ресурсы

Создание наблюдаемых последовательностей и запрос к ней