Erkunden der wichtigsten Schnittstellen in Rx

In diesem Thema werden die wichtigsten Rx-Schnittstellen (Reactive Extensions) beschrieben, mit denen beobachtbare Sequenzen dargestellt und abonniert werden.

Die IObservable<T>/IObserver<T-Schnittstellen> sind in der .NET Framework 4.0-Basisklassenbibliothek verfügbar und werden in einem Paket bereitgestellt, das in .NET 3.5, Silverlight 3 und 4 sowie Javascript installiert werden kann.

IObservable<T>/IObserver<T>

Rx macht asynchrone und ereignisbasierte Datenquellen als pushbasierte, beobachtbare Sequenzen verfügbar, die von der neuen IObservable<T-Schnittstelle> in .NET Framework 4.0 abstrahiert werden. Diese IObservable<T-Schnittstelle> ist ein Dualer der bekannten IEnumerable<T-Schnittstelle> , die für pullbasierte, aufzählbare Sammlungen verwendet wird. Es stellt eine Datenquelle dar, die beobachtet werden kann, was bedeutet, dass sie Daten an alle interessierten Personen senden kann. Es verwaltet eine Liste der abhängigen IObserver<T-Implementierungen> , die solche interessierten Listener darstellen, und benachrichtigt sie automatisch über Zustandsänderungen.

Eine Implementierung der IObservable<T-Schnittstelle> kann als Sammlung von Elementen des Typs T angezeigt werden. Daher kann ein IObservable<int> als sammlung von ganzen Zahlen angezeigt werden, in denen ganze Zahlen an die abonnierten Beobachter gepusht werden.

Wie in Was ist Rx beschrieben, wird die andere Hälfte des Pushmodells durch die IObserver<T-Schnittstelle> dargestellt, die einen Beobachter darstellt, der ein Interesse über ein Abonnement registriert. Anschließend werden elemente aus der beobachtbaren Sequenz, die er abonniert, an den Beobachter übergeben.

Um Benachrichtigungen von einer beobachtbaren Sammlung zu erhalten, verwenden Sie die Subscribe-Methode von IObservable, um ihr ein IObserver<T-Objekt> zu übergeben. Im Gegenzug für diesen Beobachter gibt die Subscribe-Methode ein IDisposable-Objekt zurück, das als Handle für das Abonnement fungiert. Dadurch können Sie das Abonnement sauber, nachdem Sie fertig sind.  Durch Aufrufen von Dispose für dieses Objekt wird der Beobachter von der Quelle getrennt, sodass keine Benachrichtigungen mehr übermittelt werden. Wie Sie ableiten können, müssen Sie in Rx kein explizites Abonnement eines Ereignisses wie im .NET-Ereignismodell kündigen.

Beobachter unterstützen drei Veröffentlichungsereignisse, die von den Methoden der Schnittstelle reflektiert werden. OnNext kann null oder häufiger aufgerufen werden, wenn die beobachtbare Datenquelle Daten zur Verfügung hat. Beispielsweise kann eine beobachtbare Datenquelle, die für Mausbewegungsereignisse verwendet wird, jedes Mal ein Point-Objekt senden, wenn die Maus bewegt wurde. Die anderen beiden Methoden werden verwendet, um die Vervollständigung oder Fehler anzugeben.

Im Folgenden werden die IObservable<T>/IObserver<T-Schnittstellen> aufgeführt.

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.
} 

Rx bietet auch Subscribe-Erweiterungsmethoden, sodass Sie die Implementierung der IObserver<T-Schnittstelle> selbst vermeiden können. Für jedes Veröffentlichungsereignis (OnNext, OnError, OnCompleted) einer beobachtbaren Sequenz können Sie einen Delegaten angeben, der aufgerufen wird, wie im folgenden Beispiel gezeigt. Wenn Sie keine Aktion für ein Ereignis angeben, tritt das Standardverhalten auf.

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

Sie können die beobachtbare Sequenz (z. B. eine Sequenz von Mouseover-Ereignissen) wie eine normale Auflistung behandeln. Daher können Sie LINQ-Abfragen über die Sammlung schreiben, um Dinge wie Filtern, Gruppieren, Verfassen usw. auszuführen. Um beobachtbare Sequenzen nützlicher zu machen, stellen die Rx-Assemblys viele FACTORY-LINQ-Operatoren bereit, sodass Sie diese nicht selbst implementieren müssen. Dies wird im Thema Abfragen beobachtbarer Sequenzen mithilfe von LINQ-Operatoren behandelt.

Warnung

Sie müssen die IObservable<T>/IObserver<T-Schnittstellen> nicht selbst implementieren. Rx stellt interne Implementierungen dieser Schnittstellen für Sie bereit und macht sie über verschiedene Erweiterungsmethoden verfügbar, die von den Typen Observable und Observer bereitgestellt werden. Weitere Informationen finden Sie im Thema Erstellen und Abfragen beobachtbarer Sequenzen .

Weitere Informationen

Konzepte

Abfragen beobachtbarer Sequenzen mithilfe von LINQ-Operatoren

Weitere Ressourcen

Erstellen und Abfragen beobachtbarer Sequenzen