コード例 #1
0
        IEnumerator PreloadCore(int preloadCount, int threshold, IObserver <Unit> observer, CancellationToken cancellationToken)
        {
            while (Count < preloadCount && !cancellationToken.IsCancellationRequested)
            {
                int requireCount = preloadCount - Count;
                if (requireCount <= 0)
                {
                    break;
                }

                int createCount = Math.Min(requireCount, threshold);

                IObservable <Unit>[] loaders = new IObservable <Unit> [createCount];
                for (int i = 0; i < createCount; i++)
                {
                    IObservable <T> instanceFuture = CreateInstanceAsync();
                    loaders[i] = instanceFuture.ForEachAsync(x => Return(x));
                }

                ObservableYieldInstruction <Unit> awaiter = Observable.WhenAll(loaders).ToYieldInstruction(false, cancellationToken);
                while (!(awaiter.HasResult || awaiter.IsCanceled || awaiter.HasError))
                {
                    yield return(null);
                }

                if (awaiter.HasError)
                {
                    observer.OnError(awaiter.Error);
                    yield break;
                }
                else if (awaiter.IsCanceled)
                {
                    yield break; // end.
                }
            }

            observer.OnNext(Unit.Default);
            observer.OnCompleted();
        }
コード例 #2
0
 private IEnumerator PreloadCore(int preloadCount, int threshold, IObserver <Unit> observer, CancellationToken cancellationToken)
 {
     while (this.Count < preloadCount && !cancellationToken.IsCancellationRequested)
     {
         int requireCount = preloadCount - this.Count;
         if (requireCount <= 0)
         {
             break;
         }
         int createCount = Math.Min(requireCount, threshold);
         IObservable <Unit>[] loaders = new IObservable <Unit> [createCount];
         for (int i = 0; i < createCount; i++)
         {
             IObservable <T> source = this.CreateInstanceAsync();
             loaders[i] = source.ForEachAsync(delegate(T x)
             {
                 this.Return(x);
             });
         }
         ObservableYieldInstruction <Unit> awaiter = Observable.WhenAll(loaders).ToYieldInstruction(false, cancellationToken);
         while (!awaiter.HasResult && !awaiter.IsCanceled && !awaiter.HasError)
         {
             yield return(null);
         }
         if (awaiter.HasError)
         {
             observer.OnError(awaiter.Error);
             yield break;
         }
         if (awaiter.IsCanceled)
         {
             yield break;
         }
     }
     observer.OnNext(Unit.Default);
     observer.OnCompleted();
     yield break;
 }