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(); }