public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; if (!Producers.Any()) { Logger.LogDebug($"Disposed producer pool with no producers in the pool."); return; } var poolDisposeStopwatch = Stopwatch.StartNew(); Logger.LogInformation($"Disposing producer pool ({Producers.Count} producers)."); var remainingWaitDuration = TotalDisposeWaitDuration; foreach (var producer in Producers.Values) { var poolItemDisposeStopwatch = Stopwatch.StartNew(); try { producer.Value.Dispose(); } catch { } poolItemDisposeStopwatch.Stop(); remainingWaitDuration = remainingWaitDuration > poolItemDisposeStopwatch.Elapsed ? remainingWaitDuration.Subtract(poolItemDisposeStopwatch.Elapsed) : TimeSpan.Zero; } poolDisposeStopwatch.Stop(); Logger.LogInformation( $"Disposed Kafka Producer Pool ({Producers.Count} producers in {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms)."); if (poolDisposeStopwatch.Elapsed.TotalSeconds > 5.0) { Logger.LogWarning( $"Disposing Kafka Producer Pool got time greather than expected: {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms."); } Producers.Clear(); }