Reputation: 796
I'm wondering if there's a way to figure out how many observers there are subscribed to an IObservable object.
I've got a class that manages a HashTable of filtered IObservable instances, and I'd like to implement a "health check" routine that can determine if subscribers have been removed / disposed, without each subscriber having to explicitly notify this class that they're finished (i.e. should be implicit via Dispose() or Unsubscribe()).
This doesn't really answer the question -
should-i-use-listiobserver-or-simply-actiont-to-keep-track-of-an-iobservable
Any ideas Rx experts?
Upvotes: 3
Views: 1150
Reputation: 84824
There's nothing built in, but you could implement a 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; }
}
}
Upvotes: 7
Reputation: 134125
Since IObservable<T>
only supplies a single method, Subscribe
, there's no way you can get the count of subscribers from it. The subscriber list is an implementation detail that's not exposed through this interface.
In order to get the count, whatever class implements the IObservable
interface would have to expose a property or method to get the count, and the client code would have to cast the IObservable
reference to that type, and then access the property or method.
Upvotes: 1