Pause and Resume Subscription on cold IObservable

后端 未结 4 505
南笙
南笙 2020-12-03 03:45

Using Rx, I desire pause and resume functionality in the following code:

How to implement Pause() and Resume() ?

    static IDisposable _subscripti         


        
4条回答
  •  眼角桃花
    2020-12-03 04:20

    Here it is as an application of IConnectableObservable that I corrected slightly for the newer api (original here):

    public static class ObservableHelper {
        public static IConnectableObservable WhileResumable(Func condition, IObservable source) {
            var buffer = new Queue();
            var subscriptionsCount = 0;
            var isRunning = System.Reactive.Disposables.Disposable.Create(() => {
                lock (buffer)
                {
                    subscriptionsCount--;
                }
            });
            var raw = Observable.Create(subscriber => {
                lock (buffer)
                {
                    subscriptionsCount++;
                    if (subscriptionsCount == 1)
                    {
                        while (buffer.Count > 0) {
                            subscriber.OnNext(buffer.Dequeue());
                        }
                        Observable.While(() => subscriptionsCount > 0 && condition(), source)
                            .Subscribe(
                                v => { if (subscriptionsCount == 0) buffer.Enqueue(v); else subscriber.OnNext(v); },
                                e => subscriber.OnError(e),
                                () => { if (subscriptionsCount > 0) subscriber.OnCompleted(); }
                            );
                    }
                }
                return isRunning;
            });
            return raw.Publish();
        }
    }
    

提交回复
热议问题