11 Stimmen

Kombinieren Sie mehrere Ereignisquellen in einer IObservable mit Rx

Dies ist eine Frage über die Verwendung von Reactive Extensions (Rx) in einem bestimmten ereignisbezogenen Szenario.

  • Das Ziel ist es, eine Reihe von Klassen zu nehmen, die ein Ereignis auslösen
  • Und sie zu einem einzigen zusammenführen IObservable die von beliebigen Clients (die die Ereignisklassen nicht kennen) abonniert werden können.
  • Beachten Sie, dass die Ereignisse von Interesse subclassed verwenden EventArgs

Einige benutzerdefinierte EventArgs

public class HappenedEventArgs : EventArgs
{
    internal bool IsBadNotGood;
}

Viele getrennte Klassen, in denen sich Ereignisse ereignen

public class EventSourceA : IEventSource {

    public event HappenedEventHandler Happened;
    private void OnHappened(HappenedEventArgs e)
    {
        if (Happened != null)
            Happened(this, e);
    }
    // And then this class calls OnHappened(e) whenever it decides to ...
}

public class EventSourceB : IEventSource {

    public event HappenedEventHandler Happened;
    private void OnHappened(HappenedEventArgs e)
    {
        if (Happened != null)
            Happened(this, e);
    }
    // And then this class also calls OnHappened(e) at times ...
}

public interface IEventSource
{
    event HappenedEventHandler Happened;
}

public delegate void HappenedEventHandler(object sender, HappenedEventArgs e);

Wie man all diese Ereignisse bündelt und eine einheitliche Veranstaltungsfront aufdeckt

public class Pooler{

    private IObservable<X> _pool;

    public IObservable<X> Subscribe(){
        return _pool;        
    }

    public void Register(IEventSource item)
    {
        // How to take item.Happened and inject/bind it into _pool here?
    }        

    internal void Unregister(IEventSource item)
    {
        // Disconnect item.Happened from _pool
    }

    public Pooler(){
        // Instantiate _pool to whatever is best?
        // _pool = ...
    }

 }

Ein Abonnent, der nichts über EventSources weiß, direkt

 static void Try() {
     var pooler = new Pooler();
     pooler.Subscribe().Subscribe(e =>
            {
                 // Do something with events here, as they arrive
            }
     );
     // ....
     // Wherever whenever:
     AddEventSources(pooler);
 }

 static void AddEventSources(Pooler pooler){
     var eventSourceA = new EventSourceA();
     pooler.Register(eventSourceA);
     var eventSourceB = new EventSourceB();
     pooler.Register(eventSourceB);     
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X