Kombinieren Sie mehrere Ereignisquellen zu einem IObservable mit Rx

8

Dies ist eine Frage zur Verwendung von Reaktive Erweiterungen (Rx) in einem bestimmten ereignisbezogenen Szenario.

  • Ziel ist es, eine Anzahl von Klassen zu nehmen, die ein Ereignis auslösen
  • Und sammeln Sie sie in einem IObservable , das von beliebigen Clients abonniert werden kann (ohne die Ereignisklassen zu kennen).
  • Beachten Sie die Ereignisse, die von Interesse sind, verwenden Sie subclassed EventArgs

Einige benutzerdefinierte EventArgs

%Vor%

Viele separate Klassen, in denen Ereignisse aufgetreten sind

%Vor%

So sammeln Sie alle diese Ereignisse und stellen eine United Event Front

zur Verfügung %Vor%

Ein Abonnent, der nichts über EventSources direkt weiß

%Vor%     
Cel 19.11.2011, 13:55
quelle

2 Antworten

6

Was die Rx-Bibliothek zu bieten versucht, sind Möglichkeiten, mit solchen Situationen umzugehen, ohne eine Reihe von Klassen / Methoden erstellen zu müssen, die Observables manuell propagieren.

Nehmen wir an, Sie hatten eine Klasse mit einem Ereignis:

%Vor%

Und ein Aufzählungszeichen dieser Instanzen IEnumerable<EventedClass> objects , Sie können LINQ verwenden, um Observables aus diesen Klassen zu projizieren, kombinieren Sie sie mit Observable.Merge , was Ihnen die kombinierte sequentielle Ausgabe dieser Ereignisse liefert.

%Vor%     
Asti 19.11.2011, 16:23
quelle
3

Es hört sich so an, als ob Sie etwas ähnlich wie diese Frage . Im Grunde genommen möchten Sie ein Thema als Ihre _pool -Variable verwenden und sich die verschiedenen Ereignisquellen bei Registrieren und Abmelden abonnieren und abmelden lassen. Um die Registrierung einer Quelle aufzuheben, müssen Sie die Verbrauchsmaterialien behalten, die Sie in dem Aufruf zum Registrieren erhalten haben. Außerdem würde ich in Erwägung ziehen, Pooler direkt IObservable implementieren und Subscribe nur an die Variable _pool weiterleiten.

%Vor%

Beachten Sie, dass Sie IDisposable implementieren müssen, um sicherzustellen, dass Sie alle Ereignissubskriptionen bereinigen können, wenn Sie mit Pooler fertig sind.

    
Gideon Engelberth 21.11.2011 18:11
quelle