Eksplorowanie głównych interfejsów w języku Rx
W tym temacie opisano główne interfejsy reaktywne (Rx) używane do reprezentowania obserwowanych sekwencji i subskrybowania ich.
Interfejsy IObservable<T/IObserver<T>> są dostępne w bibliotece klas bazowych .NET Framework 4.0 i są dostępne w pakiecie, który można zainstalować na platformie .NET 3.5, Silverlight 3 i 4, a także w języku JavaScript.
IObservable<T/IObserver<T>>
Język Rx uwidacznia asynchroniczne i oparte na zdarzeniach źródła danych jako sekwencje wypychane, obserwowalne sekwencje abstrakcyjne przez nowy interfejs IObservable<T> w .NET Framework 4.0. Ten interfejs IObservable<T> jest podwójnym znanym interfejsem IEnumerable<T> używanym do ściągania, wyliczalnych kolekcji. Reprezentuje ono źródło danych, które można zaobserwować, co oznacza, że może wysyłać dane do każdego, kto jest zainteresowany. Utrzymuje on listę zależnych implementacji IObserver<T> reprezentujących takie zainteresowane odbiorniki i powiadamia je automatycznie o wszelkich zmianach stanu.
Implementacja interfejsu IObservable<T> może być postrzegana jako kolekcja elementów typu T. W związku z tym liczba całkowita IObservable<> może być postrzegana jako kolekcja liczb całkowitych, w której liczby całkowite zostaną wypchnięte do subskrybowanych obserwatorów.
Zgodnie z opisem w artykule Co to jest Rx, druga połowa modelu wypychania jest reprezentowana przez interfejs IObserver<T> , który reprezentuje obserwatora, który rejestruje zainteresowanie za pośrednictwem subskrypcji. Elementy są następnie przekazywane obserwatorowi z obserwowanej sekwencji, do której subskrybuje.
Aby otrzymywać powiadomienia z widocznej kolekcji, należy użyć metody Subscribe elementu IObservable, aby przekazać mu obiekt IObserver<T> . W zamian dla tego obserwatora metoda Subscribe zwraca obiekt IDisposable, który działa jako uchwyt dla subskrypcji. Dzięki temu można wyczyścić subskrypcję po zakończeniu. Wywołanie metody Dispose dla tego obiektu odłącza obserwatora od źródła, aby powiadomienia nie były już dostarczane. Jak można wywnioskować, w języku Rx nie trzeba jawnie anulować subskrypcji zdarzenia, tak jak w modelu zdarzeń platformy .NET.
Obserwatorzy obsługują trzy zdarzenia publikacji, odzwierciedlone przez metody interfejsu. OnNext może być wywoływany zero lub więcej razy, gdy obserwowalne źródło danych ma dostępne dane. Na przykład obserwowalne źródło danych używane na potrzeby zdarzeń przenoszenia myszy może wysyłać obiekt point za każdym razem, gdy mysz się przeniosła. Pozostałe dwie metody służą do wskazywania ukończenia lub błędów.
Poniżej wymieniono interfejsy T/IObserver<typu>> 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.
}
Język Rx udostępnia również metody rozszerzenia Subskrybuj, aby uniknąć samodzielnego implementowania interfejsu IObserver<T> . Dla każdego zdarzenia publikacji (OnNext, OnError, OnCompleted) obserwowalnej sekwencji można określić delegata, który zostanie wywołany, jak pokazano w poniższym przykładzie. Jeśli nie określisz akcji dla zdarzenia, zostanie wykonane domyślne zachowanie.
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"));
Można traktować obserwowaną sekwencję (np. sekwencję zdarzeń myszy), tak jakby była to normalna kolekcja. W związku z tym można pisać zapytania LINQ w kolekcji, aby wykonywać takie czynności jak filtrowanie, grupowanie, komponowanie itp. Aby bardziej użyteczne były zauważalne sekwencje, zestawy Rx udostępniają wiele operatorów LINQ fabryki, dzięki czemu nie trzeba ich implementować samodzielnie. Zostanie to omówione w temacie Querying Observable Sequences using LINQ Operators (Wykonywanie zapytań dotyczących sekwencji obserwowanych przy użyciu operatorów LINQ ).
Ostrzeżenie
Nie trzeba samodzielnie implementować interfejsów T/IObserver<typu>> IObservable<. Język Rx udostępnia wewnętrzne implementacje tych interfejsów i udostępnia je za pomocą różnych metod rozszerzeń udostępnianych przez typy Obserwowane i Obserwatora. Aby uzyskać więcej informacji, zobacz temat Tworzenie i wykonywanie zapytań dotyczących obserwowanych sekwencji .
Zobacz też
Pojęcia
Wykonywanie zapytań dotyczących obserwowanych sekwencji przy użyciu operatorów LINQ
Inne zasoby
Tworzenie i wykonywanie zapytań dotyczących obserwowanych sekwencji