统计一个主题的所有订阅
Count all subscriptions of a subject
我有一个主题,我订阅了当游戏中确定的事件发生时应该调用的方法。
public Subject<SomeEvent> TestSubject = new Subject<SomeEvent>();
一些实例订阅了该主题。
TestSubject.Subscribe(MyMethod);
我的objective是统计有多少方法订阅了那个Subject。我看过一些使用 Count() 扩展的示例,但我需要一个 int 作为 return 值,这样我就可以在其他地方使用它,而 Count() return 是一个 IObservable.
if (subjectCount > 0)
{
DoSomething();
}
有没有什么方法可以获取某个主题的订阅数量,或者我是否需要手动跟踪它们(有一个 public int SubjectSubcriptions 并在每次订阅方法时添加 1)?
最简单的方法是创建您自己的 ISubject 实现,并使用主题包装器。
public class CountSubject<T> : ISubject<T>, IDisposable
{
private readonly ISubject<T> _baseSubject;
private int _counter;
private IDisposable _disposer = Disposable.Empty;
private bool _disposed;
public int Count
{
get { return _counter; }
}
public CountSubject()
: this(new Subject<T>())
{
// Need to clear up Subject we created
_disposer = (IDisposable) _baseSubject;
}
public CountSubject(ISubject<T> baseSubject)
{
_baseSubject = baseSubject;
}
public void OnCompleted()
{
_baseSubject.OnCompleted();
}
public void OnError(Exception error)
{
_baseSubject.OnError(error);
}
public void OnNext(T value)
{
_baseSubject.OnNext(value);
}
public IDisposable Subscribe(IObserver<T> observer)
{
Interlocked.Increment(ref _counter);
return new CompositeDisposable(Disposable.Create(() => Interlocked.Decrement(ref _counter)),
_baseSubject.Subscribe(observer));
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_disposer.Dispose();
}
_disposed = true;
}
}
}
我很好奇这是否仅用于测试目的。如果是这样,那么 Rx-Testing nuget 包提供了为您提供此信息的工具。
例如您可以像这样在单元测试中验证订阅数量
TestScheduler scheduler = new TestScheduler();
var obs = scheduler.CreateColdObservable(
ReactiveTest.OnNext(1, "foo"),
ReactiveTest.OnNext(1000, "bar"),
);
//Do some work that should add subscriptions.
Assert.AreEqual(expectedSubriptionCount, obs.Subscriptions);
我有一个主题,我订阅了当游戏中确定的事件发生时应该调用的方法。
public Subject<SomeEvent> TestSubject = new Subject<SomeEvent>();
一些实例订阅了该主题。
TestSubject.Subscribe(MyMethod);
我的objective是统计有多少方法订阅了那个Subject。我看过一些使用 Count() 扩展的示例,但我需要一个 int 作为 return 值,这样我就可以在其他地方使用它,而 Count() return 是一个 IObservable.
if (subjectCount > 0)
{
DoSomething();
}
有没有什么方法可以获取某个主题的订阅数量,或者我是否需要手动跟踪它们(有一个 public int SubjectSubcriptions 并在每次订阅方法时添加 1)?
最简单的方法是创建您自己的 ISubject 实现,并使用主题包装器。
public class CountSubject<T> : ISubject<T>, IDisposable
{
private readonly ISubject<T> _baseSubject;
private int _counter;
private IDisposable _disposer = Disposable.Empty;
private bool _disposed;
public int Count
{
get { return _counter; }
}
public CountSubject()
: this(new Subject<T>())
{
// Need to clear up Subject we created
_disposer = (IDisposable) _baseSubject;
}
public CountSubject(ISubject<T> baseSubject)
{
_baseSubject = baseSubject;
}
public void OnCompleted()
{
_baseSubject.OnCompleted();
}
public void OnError(Exception error)
{
_baseSubject.OnError(error);
}
public void OnNext(T value)
{
_baseSubject.OnNext(value);
}
public IDisposable Subscribe(IObserver<T> observer)
{
Interlocked.Increment(ref _counter);
return new CompositeDisposable(Disposable.Create(() => Interlocked.Decrement(ref _counter)),
_baseSubject.Subscribe(observer));
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_disposer.Dispose();
}
_disposed = true;
}
}
}
我很好奇这是否仅用于测试目的。如果是这样,那么 Rx-Testing nuget 包提供了为您提供此信息的工具。
例如您可以像这样在单元测试中验证订阅数量
TestScheduler scheduler = new TestScheduler();
var obs = scheduler.CreateColdObservable(
ReactiveTest.OnNext(1, "foo"),
ReactiveTest.OnNext(1000, "bar"),
);
//Do some work that should add subscriptions.
Assert.AreEqual(expectedSubriptionCount, obs.Subscriptions);