2012-03-13 12 views
3

IObservableへのアクティブなサブスクリプションの数を把握したいと思いますか? 私は、誰かがSubscribe/Disposeを呼び出すたびにカウンタをインクリメント/デクリメントすることでこれを実装できると考えました。RX:サブスクリプションの開始または破棄時にアクションを実行しますか?

どうすればいいですか? これを行うにはより良い方法がありますか?

RefCountによって内部的に行われているようですが、サブスクリプションカウンタは公開されていません。

おかげ

+0

ええ、onCompleteの中UNSUBのは簡単だろうと思ったが、それは、スレッドを確保するために、 'lock'または' InterLocked'を使用することを忘れないでください – mtyson

答えて

5

これを行う最も簡単な方法は、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. 
    }); 
}); 
+1

ではありません「TODO」セクションの安全性。 – Enigmativity

3

感謝。 次のようにこれは、オペレータに変えることができます。

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(); 
           }; 
          }); 
    } 
関連する問題