public async Task StopReceive(CancellationToken cancellationToken = default) { messageReceivingCancellationTokenSource?.Cancel(); using (cancellationToken.Register(() => messageProcessingCancellationTokenSource?.Cancel())) { await messageReceivingTask.ConfigureAwait(false); while (concurrencyLimiter.CurrentCount != maxConcurrency) { // Do not forward cancellationToken here so that pump has ability to exit gracefully // Individual message processing pipelines will be canceled instead await Task.Delay(50, CancellationToken.None).ConfigureAwait(false); } try { await receiver.CloseAsync(cancellationToken).ConfigureAwait(false); } catch (Exception ex) when(ex.IsCausedBy(cancellationToken)) { Logger.Debug($"Operation canceled while stopping the receiver {receiver.EntityPath}.", ex); } } concurrencyLimiter?.Dispose(); messageReceivingCancellationTokenSource?.Dispose(); messageProcessingCancellationTokenSource?.Dispose(); circuitBreaker?.Dispose(); messageReceivingTask = null; }
public async Task Stop() { messageProcessing.Cancel(); await receiveLoopTask.ConfigureAwait(false); while (semaphore.CurrentCount + Volatile.Read(ref numberOfExecutingReceives) != maxConcurrency) { await Task.Delay(50).ConfigureAwait(false); } await receiver.CloseAsync().ConfigureAwait(false); semaphore?.Dispose(); messageProcessing?.Dispose(); circuitBreaker?.Dispose(); }