/// <summary> /// Creates a Windows Runtime asynchronous action that represents the completion of the observable sequence, using a selector function to map the source sequence on a progress reporting sequence. /// Upon cancellation of the asynchronous action, the subscription to the source sequence will be disposed. /// </summary> /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam> /// <typeparam name="TProgress">The type of the elements in the progress sequence.</typeparam> /// <param name="source">Source sequence to expose as an asynchronous action and to compute a progress sequence that gets reported through the asynchronous action.</param> /// <param name="progressSelector">Selector function to map the source sequence on a progress reporting sequence.</param> /// <returns>Windows Runtime asynchronous action object representing the completion of the result sequence, reporting progress computed through the progress sequence.</returns> /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="progressSelector"/> is null.</exception> public static IAsyncActionWithProgress <TProgress> ToAsyncActionWithProgress <TSource, TProgress>(this IObservable <TSource> source, Func <IObservable <TSource>, IObservable <TProgress> > progressSelector) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (progressSelector == null) { throw new ArgumentNullException(nameof(progressSelector)); } return(AsyncInfo.Run <TProgress>((ct, progress) => { return Observable.Create <TSource?>(observer => { var obs = Observer.Synchronize(observer); var data = source.Publish(); var progressSubscription = progressSelector(data).Subscribe(progress.Report, obs.OnError); var dataSubscription = data.DefaultIfEmpty().Subscribe(obs); var connection = data.Connect(); return StableCompositeDisposable.CreateTrusted(progressSubscription, dataSubscription, connection); }).ToTask(ct); })); }
public void Run(IEnumerable <IObservable <TSource> > sources) { var srcs = sources.ToArray(); var N = srcs.Length; _hasValue = new bool[N]; _hasValueAll = false; _values = new TSource[N]; _isDone = new bool[N]; _subscriptions = new IDisposable[N]; for (var i = 0; i < N; i++) { var j = i; var o = new SourceObserver(this, j); _subscriptions[j] = o; o.SetResource(srcs[j].SubscribeSafe(o)); } SetUpstream(StableCompositeDisposable.CreateTrusted(_subscriptions)); }