<PackageReference Include="Polly" Version="7.1.1" />

AsyncBulkheadPolicy<TResult>

public class AsyncBulkheadPolicy<TResult> : AsyncPolicy<TResult>, IBulkheadPolicy<TResult>, IBulkheadPolicy, IsPolicy, IDisposable
A bulkhead-isolation policy which can be applied to delegates.
using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace Polly.Bulkhead { public class AsyncBulkheadPolicy<TResult> : AsyncPolicy<TResult>, IBulkheadPolicy<TResult>, IBulkheadPolicy, IsPolicy, IDisposable { private readonly SemaphoreSlim _maxParallelizationSemaphore; private readonly SemaphoreSlim _maxQueuedActionsSemaphore; private readonly int _maxParallelization; private readonly int _maxQueueingActions; private Func<Context, Task> _onBulkheadRejectedAsync; public int BulkheadAvailableCount => _maxParallelizationSemaphore.CurrentCount; public int QueueAvailableCount => Math.Min(_maxQueuedActionsSemaphore.CurrentCount, _maxQueueingActions); internal AsyncBulkheadPolicy(int maxParallelization, int maxQueueingActions, SemaphoreSlim maxParallelizationSemaphore, SemaphoreSlim maxQueuedActionsSemaphore, Func<Context, Task> onBulkheadRejectedAsync) : base((PolicyBuilder<TResult>)null) { _maxParallelization = maxParallelization; _maxQueueingActions = maxQueueingActions; _maxParallelizationSemaphore = maxParallelizationSemaphore; _maxQueuedActionsSemaphore = maxQueuedActionsSemaphore; if (onBulkheadRejectedAsync == null) throw new ArgumentNullException("onBulkheadRejectedAsync"); _onBulkheadRejectedAsync = onBulkheadRejectedAsync; } [DebuggerStepThrough] protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) { return AsyncBulkheadEngine.ImplementationAsync<TResult>(action, context, _onBulkheadRejectedAsync, _maxParallelizationSemaphore, _maxQueuedActionsSemaphore, cancellationToken, continueOnCapturedContext); } public void Dispose() { _maxParallelizationSemaphore.Dispose(); _maxQueuedActionsSemaphore.Dispose(); } } }