私は単純に 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);
実際に登録者数を知りたい場合はこれに該当しませんが、登録者がいない場合は業務を停止するという要件には合致すると思います。