Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Rx proporciona métodos de fábrica para que pueda enlazar con orígenes asincrónicos existentes en .NET para poder emplear las características enriquecidas de redacción, filtrado y administración de recursos proporcionadas por Rx en cualquier tipo de flujos de datos. En este tema se examina el operador FromEventPattern que permite "importar" un evento de .NET en Rx como una secuencia observable. Cada vez que se genera un evento, se entregará un mensaje OnNext a la secuencia observable. A continuación, puede manipular datos de eventos como cualquier otra secuencia observable.
Rx no pretende reemplazar modelos de programación asincrónicos existentes, como eventos de .NET, el patrón asincrónico o la biblioteca de tareas paralelas. Sin embargo, al intentar crear eventos, los métodos de fábrica de Rx le proporcionarán la comodidad que no se encuentra en el modelo de programación actual. Esto es especialmente cierto para el mantenimiento de recursos (por ejemplo, cuándo cancelar la suscripción) y el filtrado (por ejemplo, elegir qué tipo de datos recibir). En este tema y los siguientes, puede examinar cómo estas características rx pueden ayudarle en la programación asincrónica.
Convertir un evento de .NET en una secuencia observable rx
En el ejemplo siguiente se crea un controlador de eventos de .NET simple para el evento de movimiento del mouse y se imprime la ubicación del mouse en una etiqueta de un formulario Windows.
using System.Linq;
using System.Windows.Forms;
using System.Reactive;
using System.Reactive.Linq;
using System;
using WinForm;
using System.Reactive.Disposables;
class Program {
static void Main()
{
var lbl = new Label();
var frm = new Form { Controls = { lbl } };
frm.MouseMove += (sender, args) =>
{
lbl.Text = args.Location.ToString();
};
Application.Run(frm);
};
}
Para importar un evento en Rx, puede usar el operador FromEventPattern y proporcionar los objetos EventArgs que generará el evento que se va a enlazar. El operador FromEventPattern funciona con eventos que toman un remitente de objeto y algunos EventArgs, y usa la reflexión para buscar esos métodos add/remove para usted. A continuación, convierte el evento dado en una secuencia observable con un tipo EventPattern que captura tanto el remitente como los argumentos del evento.
En el caso de los delegados que tienen un parámetro (eventos no estándar), puede usar el operador FromEvent que toma un par de funciones que se usan para adjuntar y desasociar un controlador.
En el ejemplo siguiente, se convierte la secuencia de eventos de movimiento del mouse de un formulario de Windows en una secuencia observable. Cada vez que se desencadena un evento de movimiento del mouse, el suscriptor recibirá una notificación OnNext. A continuación, podemos examinar el valor eventArgs de dicha notificación y obtener la ubicación del movimiento del mouse.
using System.Linq;
using System.Windows.Forms;
using System.Reactive;
using System.Reactive.Linq;
using System;
using WinForm;
using System.Reactive.Disposables;
class Program {
static void Main()
{
var lbl = new Label();
var frm = new Form { Controls = { lbl } };
IObservable<EventPattern<MouseEventArgs>> move = Observable.FromEventPattern<MouseEventArgs>(frm, "MouseMove");
move.Subscribe(evt => {
lbl.Text = evt.EventArgs.Location.ToString();
}) ;
Application.Run(frm);
};
}
Observe que en este ejemplo, move se convierte en una secuencia observable en la que podemos manipular más. El tema Querying Observable Sequences using LINQ Operators (Consultar secuencias observables mediante operadores LINQ ) le mostrará cómo puede proyectar esta secuencia en una colección de tipos points y filtrar su contenido, de modo que la aplicación solo recibirá valores que cumplan determinados criterios.
La limpieza del controlador de eventos se encarga del objeto IDisposable devuelto por el método Subscribe. Al llamar a Dispose (hecho llegando al final del bloque using en este ejemplo), se liberarán todos los recursos que usa la secuencia, incluido el controlador de eventos subyacente. Básicamente, esto se encarga de anular la suscripción a un evento en su nombre.