private void AddException(Exception ex) { ExceptionHelper.AddException(ref _errors, ex); }
private void NextHandler(Task <bool> t) { if (t.IsCanceled) { ExceptionHelper.AddException(ref _error, new OperationCanceledException()); _sourceDone = true; if (TryDispose()) { ResumeHelper.Resume(ref _resume); } } else if (t.IsFaulted) { ExceptionHelper.AddException(ref _error, ExceptionHelper.Extract(t.Exception)); _sourceDone = true; if (TryDispose()) { ResumeHelper.Resume(ref _resume); } } else if (t.Result) { var cts = CancellationTokenSource.CreateLinkedTokenSource(_sourceCTS.Token); IAsyncEnumerator <TResult> src; try { src = _mapper(_source.Current).GetAsyncEnumerator(cts.Token); } catch (Exception ex) { ExceptionHelper.AddException(ref _error, ex); _sourceDone = true; src = null; if (TryDispose()) { ResumeHelper.Resume(ref _resume); return; } } if (src != null) { Interlocked.Increment(ref _disposeWip); var inner = new InnerHandler(src, this, cts); _inners.Enqueue(inner); if (_disposeRequested) { while (_inners.TryDequeue(out var inner2)) { inner2.Dispose(); } } if (TryDispose()) { inner.MoveNext(); if (Interlocked.Decrement(ref _sourceOutstanding) != 0) { MoveNextSource(); } ResumeHelper.Resume(ref _resume); } } } else { _sourceDone = true; if (TryDispose()) { ResumeHelper.Resume(ref _resume); } } }