私は単純にRefCount/Publishを使用します。私はIObservableを実装しているような気がします。
myColdObservable.Publish().RefCount();
これは、誰もが切断された後であなたの目に見える停止が脈動するようにします。ここではサンプルです:
var coldObservable = Observable
.Interval(TimeSpan.FromSeconds(1))
.ObserveOn(Scheduler.TaskPool)
.Select(_ => DoSomething());
var refCountObs = coldObservable.Publish().RefCount();
CompositeDisposable d = new CompositeDisposable();
d.Add(refCountObs.Subscribe(n => Console.WriteLine("First got: " + n)));
d.Add(refCountObs.Subscribe(n => Console.WriteLine("Second got: " + n)));
d.Add(refCountObs.Subscribe(n => Console.WriteLine("Third got: " + n)));
//Wait a bit for work to happen
System.Threading.Thread.Sleep(10000);
//Everyone unsubscribes
d.Dispose();
//Observe that DoSomething is not called.
System.Threading.Thread.Sleep(3000);
これは、あなたが実際に加入者の数を知りたいが、私は何の加入者が存在しない場合は、この作業を停止するあなたの要件に合うと思うケースをカバーしていません。
ええ、私はこれをどうしなければならないかと考えました。私は組み込みの科目のうちの1つを活用することができると期待していましたが、私はそのうちの1つ(ほとんどの場合BehaviorSubject)をラップする必要があるように見えますので、加入者を追跡できます。 –
このソリューションはスレッドセーフではありません。それは生産に入る前に少しの作業が必要です。 – Enigmativity