RX: выполнить действие при запуске или удалении подписки? - PullRequest
5 голосов
/ 13 марта 2012

Я хотел бы отслеживать количество активных подписок на мой IObservable?Я думал, что мог бы реализовать это, увеличивая / уменьшая счетчик всякий раз, когда «кто-то» вызывает Subscribe / Dispose.

Как я могу это сделать?Или есть лучший способ сделать это?

Кажется, что это делается внутри RefCount, но счетчик подписок не выставляется.

Спасибо

Ответы [ 2 ]

6 голосов
/ 13 марта 2012

Самый простой способ сделать это, поместив Observable в 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.
    });
});
4 голосов
/ 15 марта 2012

Спасибо, это было то, что мне было нужно. Это можно превратить в оператора следующим образом:

public static IObservable<TSource> OnSubscribe<TSource>(this IObservable<TSource> source, Action onSubscribe, Action onDispose)
{
    return
        Observable
            .Create<TSource>(observer =>
            {
                onSubscribe?.Invoke();
                var subscription = source.Subscribe(observer);
                return () =>
                {
                    subscription.Dispose();
                    onDispose?.Invoke();
                };
            });
}
...