async Task Consume() { var prefetchCount = Math.Max(1000, _consumerContext.ReceiveSettings.CheckpointMessageCount / 10); var executor = new ChannelExecutor(prefetchCount, _consumerContext.ReceiveSettings.ConcurrencyLimit); await _consumerContext.Subscribe().ConfigureAwait(false); SetReady(); try { while (!_cancellationTokenSource.IsCancellationRequested) { ConsumeResult <TKey, TValue> consumeResult = await _consumerContext.Consume(_cancellationTokenSource.Token).ConfigureAwait(false); await executor.Push(() => Handle(consumeResult), Stopping).ConfigureAwait(false); } } catch (OperationCanceledException exception) when(exception.CancellationToken == Stopping || exception.CancellationToken == _cancellationTokenSource.Token) { } catch (Exception exception) { LogContext.Error?.Log(exception, "Consume Loop faulted"); } finally { await executor.DisposeAsync().ConfigureAwait(false); } SetCompleted(TaskUtil.Completed); }