Как определить, сколько / чистых подписчиков имеется в IObservable <T>? - PullRequest
2 голосов
/ 23 ноября 2010

Мне интересно, есть ли способ выяснить, сколько наблюдателей там подписано на объект IObservable.

У меня есть класс, который управляет HashTable отфильтрованных экземпляров IObservable, и я хотел бы реализовать подпрограмму «проверки работоспособности», которая может определить, были ли удалены или удалены подписчики, без необходимости явного уведомления каждого подписчика класс, который они закончили (т.е. должны быть неявными через Dispose () или Unsubscribe ()).

Это на самом деле не отвечает на вопрос -

должен-я потребительной listiobserver или просто-actiont-к-держать-трек-оф-ан-IObservable

Есть идеи Rx экспертов?

Ответы [ 2 ]

6 голосов
/ 23 ноября 2010

Там нет ничего встроенного, но вы можете реализовать 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 голос
/ 23 ноября 2010

Поскольку IObservable<T> предоставляет только один метод, Subscribe, вы не сможете получить количество подписчиков из него.Список подписчиков - это деталь реализации, которая не раскрывается через этот интерфейс.

Чтобы получить счетчик, любой класс, реализующий интерфейс IObservable, должен будет предоставить свойство или метод для получения счетчика, иклиентский код должен будет привести ссылку IObservable к этому типу, а затем получить доступ к свойству или методу.

...