Mostkowanie z istniejącymi zdarzeniami platformy .NET
Język Rx udostępnia metody fabryki umożliwiające łączenie z istniejącymi źródłami asynchronicznymi na platformie .NET, dzięki czemu można stosować rozbudowane funkcje komponowania, filtrowania i zarządzania zasobami udostępniane przez język Rx na dowolnych strumieniach danych. W tym temacie przedstawiono operator FromEventPattern, który umożliwia "importowanie" zdarzenia platformy .NET do języka Rx jako zauważalnej sekwencji. Za każdym razem, gdy zdarzenie jest zgłaszane, komunikat OnNext zostanie dostarczony do obserwowalnej sekwencji. Następnie można manipulować danymi zdarzeń tak samo jak w przypadku innych obserwowanych sekwencji.
Język Rx nie ma na celu zastąpienia istniejących modeli programowania asynchronicznego, takich jak zdarzenia platformy .NET, wzorzec asynchroniczny lub biblioteka równoległa zadań. Jednak podczas próby redagowania zdarzeń metody fabryki Rx zapewnią wygodę, której nie można znaleźć w bieżącym modelu programowania. Jest to szczególnie istotne w przypadku konserwacji zasobów (np. kiedy anulować subskrypcję) i filtrowania (np. wybierania rodzaju danych do odebrania). W tym temacie i w kolejnych tematach możesz sprawdzić, jak te funkcje języka Rx mogą pomóc w programowaniu asynchronicznym.
Konwertowanie zdarzenia platformy .NET na sekwencję obserwowaną przez język Rx
Poniższy przykład tworzy prostą procedurę obsługi zdarzeń platformy .NET dla zdarzenia przenoszenia myszy i drukuje lokalizację myszy w etykiecie w formularzu systemu 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);
};
}
Aby zaimportować zdarzenie do języka Rx, możesz użyć operatora FromEventPattern i podać obiekty EventArgs, które zostaną zgłoszone przez zmieszczanie zdarzenia. Operator FromEventPattern współpracuje ze zdarzeniami, które przyjmują nadawcę obiektu i niektóre klasy EventArgs, i używa odbicia w celu znalezienia tych metod dodawania/usuwania. Następnie konwertuje dane zdarzenie na obserwowaną sekwencję z typem EventPattern, który przechwytuje zarówno nadawcę, jak i argumenty zdarzenia.
W przypadku delegatów z jednym parametrem (zdarzeniami niestandardowymi) można użyć operatora FromEvent, który przyjmuje parę funkcji używanych do dołączania i odłączania programu obsługi.
W poniższym przykładzie konwertujemy strumień zdarzeń przesuwania myszy formularza systemu Windows na obserwowaną sekwencję. Za każdym razem, gdy zostanie wyzwolone zdarzenie przenoszenia myszy, subskrybent otrzyma powiadomienie OnNext. Następnie możemy sprawdzić wartość EventArgs takiego powiadomienia i uzyskać lokalizację ruchu myszy.
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);
};
}
Zauważ, że w tym przykładzie staje się zauważalną sekwencją, move
w której możemy dalej manipulować. Temat Wykonywanie zapytań dotyczących sekwencji obserwowanych przy użyciu operatorów LINQ pokazuje, jak można projektować tę sekwencję w kolekcji typu Punktów i filtrować jego zawartość, aby aplikacja otrzymała tylko wartości spełniające określone kryteria.
Czyszczenie programu obsługi zdarzeń jest obsługiwane przez obiekt IDisposable zwrócony przez metodę Subscribe. Wywołanie metody Dispose (wykonywane przez dotarcie do końca bloku using w tym przykładzie) spowoduje zwolnienie wszystkich zasobów używanych przez sekwencję, w tym program obsługi zdarzeń bazowych. Zasadniczo zajmuje się to anulowaniem subskrybowania zdarzenia w Twoim imieniu.
Zobacz też
Pojęcia
Wykonywanie zapytań dotyczących obserwowanych sekwencji przy użyciu operatorów LINQ