Freigeben über


Bridging mit vorhandenen .NET-Ereignissen

Rx stellt Factorymethoden bereit, mit denen Sie eine Brücke mit vorhandenen asynchronen Quellen in .NET herstellen können, sodass Sie die umfangreichen Funktionen zum Komponieren, Filtern und Ressourcenverwaltung von Rx für alle Arten von Datenströmen nutzen können. In diesem Thema wird der FromEventPattern-Operator untersucht, der das "Importieren" eines .NET-Ereignisses in Rx als beobachtbare Sequenz ermöglicht. Jedes Mal, wenn ein Ereignis ausgelöst wird, wird eine OnNext-Nachricht an die beobachtbare Sequenz übermittelt. Anschließend können Sie Ereignisdaten wie alle anderen beobachtbaren Sequenzen bearbeiten.

Rx zielt nicht darauf ab, vorhandene asynchrone Programmiermodelle wie .NET-Ereignisse, das asynchrone Muster oder die Task Parallel Library zu ersetzen. Wenn Sie jedoch versuchen, Ereignisse zu verfassen, bieten Ihnen die Factorymethoden von Rx den Komfort, der im aktuellen Programmiermodell nicht gefunden werden kann. Dies gilt insbesondere für die Ressourcenwartung (z. B. den Zeitpunkt der Kündigung) und das Filtern (z. B. auswahl der zu empfangenden Daten). In diesem und den folgenden Themen können Sie untersuchen, wie diese Rx-Features Sie bei der asynchronen Programmierung unterstützen können.

Konvertieren eines .NET-Ereignisses in eine Rx Observable-Sequenz

Im folgenden Beispiel wird ein einfacher .NET-Ereignishandler für das Mausbewegungsereignis erstellt und die Position der Maus in einer Bezeichnung auf einem Windows-Formular ausgegeben.

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

Um ein Ereignis in Rx zu importieren, können Sie den FromEventPattern-Operator verwenden und die EventArgs-Objekte angeben, die durch das überbrückte Ereignis ausgelöst werden. Der FromEventPattern-Operator arbeitet mit Ereignissen, die einen Objektsender und einige EventArgs annehmen, und verwendet Reflektion, um diese Add/Remove-Methoden für Sie zu finden. Anschließend wird das angegebene Ereignis in eine beobachtbare Sequenz mit einem EventPattern-Typ konvertiert, der sowohl den Absender als auch die Ereignisargumente erfasst.

Für Delegaten, die über einen Parameter (nicht standardmäßige Ereignisse) verfügen, können Sie den FromEvent-Operator verwenden, der ein Funktionspaar verwendet, das zum Anfügen und Trennen eines Handlers verwendet wird.

Im folgenden Beispiel konvertieren wir den Mausbewegungsereignisstream eines Windows-Formulars in eine beobachtbare Sequenz. Jedes Mal, wenn ein Mausbewegungsereignis ausgelöst wird, erhält der Abonnent eine OnNext-Benachrichtigung. Wir können dann den EventArgs-Wert einer solchen Benachrichtigung untersuchen und die Position der Mausbewegung abrufen.

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

Beachten Sie, dass in diesem Beispiel eine beobachtbare Sequenz wird, move in der wir weiter bearbeiten können. Im Thema Abfragen beobachtbarer Sequenzen mithilfe von LINQ-Operatoren erfahren Sie, wie Sie diese Sequenz in eine Sammlung vom Typ Points projizieren und den Inhalt filtern können, sodass Ihre Anwendung nur Werte empfängt, die bestimmte Kriterien erfüllen.

Das Bereinigen des Ereignishandlers erfolgt durch das IDisposable-Objekt, das von der Subscribe-Methode zurückgegeben wird. Durch aufrufen von Dispose (erreicht man in diesem Beispiel das Ende des using-Blocks) werden alle Ressourcen freigegeben, die von der Sequenz verwendet werden, einschließlich des zugrunde liegenden Ereignishandlers. Dadurch wird im Wesentlichen die Abmeldung eines Ereignisses in Ihrem Namen aufgehoben.

Weitere Informationen

Konzepte

Abfragen beobachtbarer Sequenzen mithilfe von LINQ-Operatoren