Exemplo n.º 1
0
 private 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);
         UniRx.IObservable <Unit>[] loaders = new UniRx.IObservable <Unit> [createCount];
         for (int i = 0; i < createCount; i++)
         {
             UniRx.IObservable <T> source = CreateInstanceAsync();
             loaders[i] = source.ForEachAsync(delegate(T x)
             {
                 Return(x);
             });
         }
         ObservableYieldInstruction <Unit> awaiter = Observable.WhenAll(loaders).ToYieldInstruction(throwOnError: 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();
 }