IObservableへのアクティブなサブスクリプションの数を把握したいと思いますか? 私は、誰かがSubscribe/Disposeを呼び出すたびにカウンタをインクリメント/デクリメントすることでこれを実装できると考えました。RX:サブスクリプションの開始または破棄時にアクションを実行しますか?
どうすればいいですか? これを行うにはより良い方法がありますか?
RefCountによって内部的に行われているようですが、サブスクリプションカウンタは公開されていません。
おかげ
IObservableへのアクティブなサブスクリプションの数を把握したいと思いますか? 私は、誰かがSubscribe/Disposeを呼び出すたびにカウンタをインクリメント/デクリメントすることでこれを実装できると考えました。RX:サブスクリプションの開始または破棄時にアクションを実行しますか?
どうすればいいですか? これを行うにはより良い方法がありますか?
RefCountによって内部的に行われているようですが、サブスクリプションカウンタは公開されていません。
おかげ
これを行う最も簡単な方法は、Observable.Createであなたの観測を包むことである:私は必要なものだった
IObservable<string> myObs;
var returnObservable = Observable.Create<string>(subj => {
// TODO: Write code to do stuff on Sub
var disp = myObs.Subscribe(subj);
return Disposable.Create(() => {
disp.Dispose();
// TODO: Write code to do stuff in unsub.
});
});
ではありません「TODO」セクションの安全性。 – Enigmativity
感謝。 次のようにこれは、オペレータに変えることができます。
public static IObservable<TSource> OnSubscribe<TSource>(this IObservable<TSource> source, Action onSubscribe, Action onDispose)
{
return Observable.Create<TSource>(observer =>
{
onSubscribe();
var subscription = source.Subscribe(observer);
return() =>
{
subscription.Dispose();
onDispose();
};
});
}
ええ、onCompleteの中UNSUBのは簡単だろうと思ったが、それは、スレッドを確保するために、 'lock'または' InterLocked'を使用することを忘れないでください – mtyson