public static ProgressObserver <WorkDoneProgressReport> CreateWorkDoneProgress( IResponseRouter router, ISerializer serializer, WorkDoneProgressBegin begin, Func <Exception, WorkDoneProgressEnd> onError, Func <WorkDoneProgressEnd> onComplete, CancellationToken cancellationToken) { var token = new ProgressToken(Guid.NewGuid().ToString()); var earlyEvents = new AsyncSubject <List <WorkDoneProgress> >(); var observer = new Subject <WorkDoneProgress>(); var disposable = new CompositeDisposable { observer, earlyEvents }; var worker = CreateWorker <WorkDoneProgress>(token, router, serializer, onError, onComplete, disposable); disposable.Add( observer .Scan(new List <WorkDoneProgress>() { begin }, (acc, v) => { acc.Add(v); return(acc); }) .Subscribe(earlyEvents.OnNext) ); disposable.Add( Observable.FromAsync(ct => router.CreateProgress(token, ct)) .Subscribe(_ => { }, e => { }, () => { earlyEvents.OnCompleted(); }) ); disposable.Add( earlyEvents .SelectMany(z => z) .Concat(observer) .Subscribe(worker) ); return(new ProgressObserver <WorkDoneProgressReport>(token, observer, CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))); }