2010-11-23 25 views
2

Je me demande s'il existe un moyen de déterminer combien d'observateurs sont abonnés à un objet IObservable. J'ai une classe qui gère un HashTable d'instances IObservable filtrées, et je voudrais implémenter une routine de "bilan de santé" qui peut déterminer si les abonnés ont été retirés/éliminés, sans que chaque abonné ait à notifier explicitement cette classe qu'ils sont finis (c'est-à-dire devrait être implicite via Dispose() ou Unsubscribe()).Comment puis-je déterminer combien d'abonnés/effacer sur un IObservable <T>?

Cela ne répond pas vraiment à la question -

should-i-use-listiobserver-or-simply-actiont-to-keep-track-of-an-iobservable

Des idées experts Rx?

Répondre

5

Il n'y a rien construit, mais vous pouvez mettre en œuvre un CountingSubject<T>:

public class CountingSubject<T> 
{ 
    private ISubject<T> internalSubject; 
    private int subscriberCount; 

    public CountingSubject() 
     : this(new Subject<T>()) 
    { 
    } 

    public CountingSubject(ISubject<T> internalSubject) 
    { 
     this.internalSubject = internalSubject; 
    } 

    public IDisposable Subscribe(IObserver<T> observer) 
    { 
     Interlocked.Increment(ref subscriberCount); 

     return new CompositeDisposable(
      this.internalSubject.Subscribe(observer), 
      Disposable.Create(() => Interlocked.Decrement(ref subscriberCount)) 
     }); 
    } 

    public int SubscriberCount 
    { 
     get { return subscriberCount; } 
    } 
} 
+0

Ouais, on dirait que c'est le chemin à parcourir. Merci pour l'exemple de code! –

+0

Nice, comme l'utilisation de CompositeDisposable –

+1

Bon exemple. Aussi, n'oubliez pas d'ajouter le ': IObservable ' à la déclaration de classe. – PICyourBrain

1

Puisque IObservable<T> ne fournit qu'une seule méthode, Subscribe, il n'y a aucun moyen d'obtenir le nombre d'abonnés. La liste d'abonnés est un détail d'implémentation qui n'est pas exposé via cette interface. Pour obtenir le nombre, quelle que soit la classe implémente, l'interface IObservable doit exposer une propriété ou une méthode pour obtenir le nombre, et le code client doit transtyper la référence IObservable à ce type, puis accéder à la propriété ou méthode.

+0

Merci pour la réponse –