Rx主题中观察者的数量

bed*_*edo 4 system.reactive

使用Rx,获取主题中当前观察者数量的最佳方法是什么?

我有一个场景,我想发布一条消息,但只有在有观察者的情况下.如果没有观察员,我需要做点别的事情.

为了解决这个问题,我所做的是创建自己的ISubject实现并公开内部IObserver集合的计数.我确信必须有一个开箱即用的方式,我只是不完全熟悉Rx提供的东西.

谢谢!

Dav*_*ton 7

使用该Subject<T>.HasObservers属性.

源代码

我不记得它何时被引入,但我很确定它并不总是存在.它可能是在Rx 2.0中添加的.


Eni*_*ity 5

您应尽可能避免实现自己的可观察(或主题)实现.

你当然可以尝试编写一个包装类来帮助.

试试这个:

public class Countable
{
    private int _count;
    public int Count { get { return _count; } }
    public IObservable<T> GetCountable<T>(IObservable<T> source)
    {
        return Observable.Create<T>(o =>
        {
            Interlocked.Increment(ref _count);
            var subscription = source.Subscribe(o);
            var decrement = Disposable.Create(() =>
            {
                Interlocked.Decrement(ref _count);
            });
            return new CompositeDisposable(subscription, decrement);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以编写如下代码:

var xs = new Subject<int>();
var countable = new Countable();
var ys = countable.GetCountable(xs);
Console.WriteLine(countable.Count);
var s1 = ys.Subscribe(y => { });
Console.WriteLine(countable.Count);
var s2 = ys.Subscribe(y => { });
Console.WriteLine(countable.Count);
s1.Dispose();
Console.WriteLine(countable.Count);
s2.Dispose();
Console.WriteLine(countable.Count);
Run Code Online (Sandbox Code Playgroud)

我的结果是:

0
1
2
1
0
Run Code Online (Sandbox Code Playgroud)