Exploración de las interfaces principales en Rx

En este tema se describen las principales interfaces de extensiones reactivas (Rx) usadas para representar secuencias observables y suscribirse a ellas.

Las interfaces T>/IObserver Tobserver> IObservable<<están disponibles en la biblioteca de clases base de .NET Framework 4.0 y vienen en un paquete que se puede instalar en .NET 3.5, Silverlight 3 y 4, así como Javascript.

IObservable<T>/IObserver<T>

Rx expone orígenes de datos asincrónicos y basados en eventos como secuencias observables basadas en inserción abstraidas por la nueva interfaz de T> IObservable<en .NET Framework 4.0. Esta interfaz IObservable<T> es un doble de la conocida interfaz T> IEnumerable<que se usa para colecciones enumerables basadas en extracción. Representa un origen de datos que se puede observar, lo que significa que puede enviar datos a cualquier persona interesada. Mantiene una lista de implementaciones IObserver<T> dependientes que representan a estos agentes de escucha interesados y los notifica automáticamente de cualquier cambio de estado.

Una implementación de la interfaz IObservable<T> se puede ver como una colección de elementos de tipo T. Por lo tanto, un int> IObservable<se puede ver como una colección de enteros, en los que los enteros se insertarán en los observadores suscritos.

Como se describe en What is Rx(What is Rx), la otra mitad del modelo de inserción se representa mediante la interfaz T> de IObserver<, que representa a un observador que registra un interés a través de una suscripción. Posteriormente, los elementos se entregan al observador desde la secuencia observable a la que se suscribe.

Para recibir notificaciones de una colección observable, se usa el método Subscribe de IObservable para entregarle un objeto T> IObserver<. A cambio de este observador, el método Subscribe devuelve un objeto IDisposable que actúa como identificador de la suscripción. Esto le permite limpiar la suscripción una vez que haya terminado.  Al llamar a Dispose en este objeto, se desasocia el observador del origen para que las notificaciones ya no se entreguen. Como puede deducir, en Rx no es necesario cancelar explícitamente la suscripción de un evento como en el modelo de eventos de .NET.

Los observadores admiten tres eventos de publicación, reflejados por los métodos de la interfaz. OnNext se puede llamar a cero o más veces, cuando el origen de datos observable tiene datos disponibles. Por ejemplo, un origen de datos observable usado para eventos de movimiento del mouse puede enviar un objeto Point cada vez que el mouse se haya movido. Los otros dos métodos se usan para indicar la finalización o los errores.

A continuación se enumeran las interfaces T/IObserver Tobserver> IObservable<<.>

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 también proporciona métodos de extensión Subscribe para que pueda evitar la implementación de la interfaz T> de IObserver<usted mismo. Para cada evento de publicación (OnNext, OnError, OnCompleted) de una secuencia observable, puede especificar un delegado que se invocará, como se muestra en el ejemplo siguiente. Si no especifica una acción para un evento, se producirá el comportamiento predeterminado.

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"));

Puede tratar la secuencia observable (por ejemplo, una secuencia de eventos de mouse sobre) como si fuera una colección normal. Por lo tanto, puede escribir consultas LINQ en la colección para hacer cosas como el filtrado, la agrupación, la composición, etc. Para que las secuencias observables sean más útiles, los ensamblados Rx proporcionan muchos operadores LINQ de fábrica para que no sea necesario implementar ninguno de estos por su cuenta. Esto se tratará en el tema Querying Observable Sequences using LINQ Operators (Consultar secuencias observables mediante operadores LINQ ).

Advertencia

No es necesario implementar las interfaces T>/IObserver IObserver><< usted mismo. Rx proporciona implementaciones internas de estas interfaces y las expone a través de varios métodos de extensión proporcionados por los tipos Observable y Observer. Consulte el tema Crear y consultar secuencias observables para obtener más información.

Consulte también

Conceptos

Consulta de secuencias observables mediante operadores LINQ

Otros recursos

Crear y consultar secuencias observables