Rx 主题中观察者的数量 [英] Count of observers in a Rx Subject

查看:29
本文介绍了Rx 主题中观察者的数量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

With Rx, what is the best way to get the number of current observers in a Subject?

我有一个场景,我想发布一条消息,但前提是有观察者.如果没有观察者,我需要做点别的.

I have a scenario where I want to publish a message, but only if there are observers. If there are no observers, I need to do something else.

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

To get around this issue, what I've done is created my own ISubject implementation and expose a count of an internal IObserver collection. I'm sure there must be an out of the box way of doing this, I'm just not fully familiar with what Rx has to offer.

谢谢!

推荐答案

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

You should avoid implementing your own observable (or subject) implementations whenever possible.

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

You could certainly try writing a wrapper class to help.

试试这个:

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);
        });
    }
}

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

You can then write code like this:

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);

我的运行结果是:

0
1
2
1
0

这篇关于Rx 主题中观察者的数量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆