Extensiones reactivas

Extensiones reactivas (Rx) es una biblioteca para crear programas asincrónicos y basados en eventos mediante secuencias observables y operadores de consulta de estilo LINQ.

Las secuencias de datos pueden adoptar muchas formas, como un flujo de datos de un archivo o servicio web, solicitudes de servicios web, notificaciones del sistema o una serie de eventos, como la entrada del usuario.

Extensiones reactivas representa todas estas secuencias de datos como secuencias observables. Una aplicación puede suscribirse a estas secuencias observables para recibir notificaciones asincrónicas a medida que llegan nuevos datos. La biblioteca Rx está disponible para el desarrollo de aplicaciones de escritorio en .NET. También se publica para Silverlight, Windows Phone 7 y JavaScript. Para obtener más información sobre estas distintas plataformas, consulte el tema Diferencias entre versiones de Rx .

Extracción frente a inserción de datos

En la programación interactiva, la aplicación sondea activamente un origen de datos para obtener más información mediante la extracción de datos de una secuencia que representa el origen. Este comportamiento se representa mediante el patrón de iterador de T/IEnumerable<T>/IEnumerator<T>. La interfaz IEnumerable<T> expone un único método GetEnumerator() que devuelve un valor de IEnumerator<T> para recorrer en iteración esta colección.  IEnumerator<T> nos permite obtener el elemento actual (devolviendo la propiedad Current) y determinar si hay más elementos para iterar (llamando al método MoveNext). 

La aplicación está activa en el proceso de recuperación de datos: además de obtener un enumerador mediante una llamada a GetEnumerator, también controla el ritmo de la recuperación llamando a MoveNext a su propia comodidad. Este patrón de enumeración es sincrónico, lo que significa que la aplicación puede bloquearse al sondear el origen de datos. Este patrón de extracción es similar a visitar la biblioteca y consultar un libro. Después de terminar con el libro, paga otra visita para ver otra.

Por otro lado, en la programación reactiva, la aplicación se ofrece más información mediante la suscripción a un flujo de datos (denominada secuencia observable en Rx) y cualquier actualización se le entrega desde el origen. La aplicación es pasiva en el proceso de recuperación de datos: aparte de suscribirse al origen observable, no sondea activamente el origen, sino simplemente reacciona a los datos que se insertan en él. Cuando la secuencia no tiene más datos que ofrecer o cuando se erra, el origen enviará un aviso al suscriptor. De este modo, la aplicación no se bloqueará esperando a que se actualice el origen.

Este es el patrón de inserción empleado por extensiones reactivas. Es similar a unirse a un club de libros en el que registra su interés en un género determinado, y los libros que coinciden con su interés se envían automáticamente a usted a medida que se publican. No necesitas estar en línea para adquirir algo que quieras. El uso de un patrón de inserción es útil en muchos escenarios, especialmente en un entorno intensivo de la interfaz de usuario en el que no se puede bloquear el subproceso de interfaz de usuario mientras la aplicación está esperando algunos eventos. Esto también es esencial en entornos de programación, como Silverlight, que tiene su propio conjunto de requisitos asincrónicos. En resumen, mediante Rx, puede hacer que la aplicación tenga mayor capacidad de respuesta.

El modelo de inserción implementado por Rx se representa mediante el patrón observable de<T>/IObserver T/IObserver<T>. La interfaz IObservable<T> es un dual de la conocida interfaz T> IEnumerable<. Abstrae una secuencia de datos y mantiene una lista de implementaciones de T> de IObserver<que están interesadas en la secuencia de datos. El IObservable notificará automáticamente a todos los observadores cualquier cambio de estado. Para registrar un interés a través de una suscripción, use el método Subscribe de IObservable, que toma un IObserver y devuelve un IDisposable. Esto le ofrece la posibilidad de realizar un seguimiento y desechar la suscripción. Además, la implementación de LINQ de Rx sobre secuencias observables permite a los desarrolladores crear consultas complejas de procesamiento de eventos a través de secuencias basadas en inserción, como eventos de .NET, cálculos<basados en APM ("IAsyncResult"), cálculos basados en T> de tareas, API de sensor y ubicación de Windows 7, flujos de eventos temporales de SQL StreamInsight, eventos de primera clase de F# y flujos de trabajo asincrónicos. Para obtener más información sobre las interfaces T/IObserver Tobserver>> IObservable<<, consulte Exploración de las interfaces principales en Rx. Para ver tutoriales sobre el uso de las distintas características de Rx, consulte Using Rx (Uso de Rx).