如何确定IObservable <t>上有多少/清除订户?</t>

时间:2010-11-23 03:54:26

标签: c# system.reactive

我想知道是否有办法弄清楚有多少观察者订阅了IObservable对象。

我有一个管理过滤IObservable实例的HashTable的类,我想实现一个“运行状况检查”例程,该例程可以确定订阅者是否已被删除/处置,而不是每个订阅者都必须明确通知这个他们完成的类(即应该通过Dispose()或Unsubscribe()隐式)。

这并没有真正回答这个问题 -

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

任何想法Rx专家?

2 个答案:

答案 0 :(得分:6)

内置任何内容,但您可以实现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; }
    }
}

答案 1 :(得分:1)

由于IObservable<T>仅提供单个方法Subscribe,因此您无法从中获取订阅者数量。订户列表是未通过此接口公开的实现细节。

为了获得计数,无论什么类实现IObservable接口都必须公开一个属性或方法来获取计数,并且客户端代码必须将IObservable引用转换为键入,然后访问属性或方法。