private bool TryDispose() { if (Interlocked.Decrement(ref _disposeWip) != 0) { Interlocked.Exchange(ref _timerLatest, EmptyHelper.EmptyIndicator); ResumeHelper.Complete(ref _disposeTask, _source.DisposeAsync()); return(false); } return(true); }
private bool TryDispose() { if (Interlocked.Decrement(ref _disposeWip) != 0) { if (_emitLast) { _emitLastItem = default; } ResumeHelper.Complete(ref _disposeTask, _source.DisposeAsync()); return(false); } return(true); }
private void SourceHandler(Task <bool> t) { var next = false; if (t.IsFaulted) { _error = ExceptionHelper.Extract(t.Exception); _done = true; } else if (t.IsCanceled) { _error = new OperationCanceledException(); _done = true; } else if (t.Result) { _queue.Enqueue(_source.Current); next = true; } else { _done = true; } // release the MoveNext, just in case if (Interlocked.Decrement(ref _disposeWip) != 0) { ResumeHelper.Complete(ref _disposeTask, _source.DisposeAsync()); } else { if (next && Interlocked.Decrement(ref _outstanding) != 0) { MoveNext(); } Signal(); } }