Reaktive Erweiterungen
Reaktive Erweiterungen (Reaktive Erweiterungen, Rx) ist eine Bibliothek zum Erstellen asynchroner und ereignisbasierter Programme mit beobachtbaren Sequenzen und Abfrageoperatoren im LINQ-Stil.
Datensequenzen können viele Formen annehmen, z. B. ein Datenstrom aus einer Datei oder einem Webdienst, Webdienstanforderungen, Systembenachrichtigungen oder eine Reihe von Ereignissen wie Benutzereingaben.
Reaktive Erweiterungen stellen alle diese Datensequenzen als beobachtbare Sequenzen dar. Eine Anwendung kann diese beobachtbaren Sequenzen abonnieren, um asynchrone Benachrichtigungen zu erhalten, wenn neue Daten eintreffen. Die Rx-Bibliothek ist für die Entwicklung von Desktopanwendungen in .NET verfügbar. Es ist auch für Silverlight, Windows Phone 7 und JavaScript veröffentlicht. Weitere Informationen zu diesen verschiedenen Plattformen finden Sie unter Unterschiede zwischen Rx-Versionen .
Pulling vs. Pushing Data
Bei der interaktiven Programmierung ruft die Anwendung aktiv eine Datenquelle ab, um weitere Informationen zu erhalten, indem Daten aus einer Sequenz abgerufen werden, die die Quelle darstellt. Ein solches Verhalten wird durch das Iteratormuster von IEnumerable<T>/IEnumerator<T> dargestellt. Die IEnumerable<T-Schnittstelle> macht eine einzelne Methode GetEnumerator() verfügbar, die einen IEnumerator<T> zurückgibt, um diese Auflistung zu durchlaufen. Mit IEnumerator<T> können wir das aktuelle Element abrufen (indem wir die Current-Eigenschaft zurückgeben) und bestimmen, ob weitere Elemente durchlaufen werden müssen (durch Aufrufen der MoveNext-Methode).
Die Anwendung ist beim Datenabruf aktiv: Neben dem Abrufen eines Enumerators durch Aufrufen von GetEnumerator steuert sie auch das Tempo des Abrufs, indem Sie MoveNext nach eigenem Ermessen aufruft. Dieses Enumerationsmuster ist synchron, was bedeutet, dass die Anwendung möglicherweise beim Abfragen der Datenquelle blockiert wird. Ein solches Pulling-Muster ähnelt dem Besuch Ihrer Bibliothek und dem Auschecken eines Buches. Nachdem Sie mit dem Buch fertig sind, besuchen Sie ein weiteres Buch, um ein anderes zu sehen.
Andererseits wird der Anwendung bei der reaktiven Programmierung mehr Informationen angeboten, indem sie einen Datenstrom abonnieren (in Rx beobachtbare Sequenz genannt), und jedes Update wird von der Quelle an sie übergeben. Die Anwendung ist im Datenabrufprozess passiv: Abgesehen vom Abonnieren der beobachtbaren Quelle, wird die Quelle nicht aktiv abgefragt, sondern nur auf die Daten reagiert, die an sie gepusht werden. Wenn der Stream keine weiteren Daten zu bieten hat oder ein Fehler aufgetreten ist, sendet die Quelle eine Benachrichtigung an den Abonnenten. Auf diese Weise wird die Anwendung nicht blockiert, indem auf die Aktualisierung der Quelle gewartet wird.
Dies ist das Pushmuster, das von reaktiven Erweiterungen verwendet wird. Es ist vergleichbar mit dem Beitritt zu einem Buchclub, in dem Sie Ihr Interesse an einem bestimmten Genre registrieren, und Bücher, die Ihrem Interesse entsprechen, werden automatisch an Sie gesendet, wenn sie veröffentlicht werden. Sie müssen nicht in der Schlange stehen, um etwas zu erwerben, das Sie möchten. Die Verwendung eines Pushmusters ist in vielen Szenarien hilfreich, insbesondere in einer Umgebung mit hoher Benutzeroberflächenlast, in der der UI-Thread nicht blockiert werden kann, während die Anwendung auf einige Ereignisse wartet. Dies ist auch in Programmierumgebungen wie Silverlight mit eigenen asynchronen Anforderungen unerlässlich. Zusammenfassend lässt sich sagen, dass Sie mithilfe von Rx ihre Anwendung reaktionsfähiger gestalten können.
Das von Rx implementierte Pushmodell wird durch das beobachtbare Muster von IObservable<T>/IObserver<T> dargestellt. Die IObservable<T-Schnittstelle> ist ein Dual der vertrauten IEnumerable<T-Schnittstelle> . Es abstrahiert eine Datensequenz und führt eine Liste der IObserver-T-Implementierungen<>, die an der Datensequenz interessiert sind. Das IObservable benachrichtigt alle Beobachter automatisch über Zustandsänderungen. Um ein Interesse über ein Abonnement zu registrieren, verwenden Sie die Subscribe-Methode von IObservable, die einen IObserver übernimmt und eine IDisposable zurückgibt. Dadurch können Sie das Abonnement nachverfolgen und verwerfen. Darüber hinaus ermöglicht die LINQ-Implementierung von Rx über beobachtbare Sequenzen Entwicklern das Verfassen komplexer Ereignisverarbeitungsabfragen über pushbasierte Sequenzen wie .NET-Ereignisse, APM-basierte Berechnungen ("IAsyncResult"), Task-T-basierte<> Berechnungen, Windows 7-Sensor- und Location-APIs, temporale SQL StreamInsight-Ereignisströme, erstklassige F#-Ereignisse und asynchrone Workflows. Weitere Informationen zu den IObservable<T>/IObserver<T-Schnittstellen> finden Sie unter Exploring The Major Interfaces in Rx. Tutorials zur Verwendung der verschiedenen Features in Rx finden Sie unter Verwenden von Rx.