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

BulkheadEngine

static class BulkheadEngine
using System; using System.Threading; using System.Threading.Tasks; namespace Polly.Bulkhead { internal static class BulkheadEngine { internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> action, Context context, Action<Context> onBulkheadRejected, SemaphoreSlim maxParallelizationSemaphore, SemaphoreSlim maxQueuedActionsSemaphore, CancellationToken cancellationToken) { if (maxQueuedActionsSemaphore.Wait(TimeSpan.Zero, cancellationToken)) try { maxParallelizationSemaphore.Wait(cancellationToken); try { return action(context, cancellationToken); } finally { maxParallelizationSemaphore.Release(); } } finally { maxQueuedActionsSemaphore.Release(); } onBulkheadRejected(context); throw new BulkheadRejectedException(); } internal static async Task<TResult> ImplementationAsync<TResult>(Func<Context, CancellationToken, Task<TResult>> action, Context context, Func<Context, Task> onBulkheadRejectedAsync, SemaphoreSlim maxParallelizationSemaphore, SemaphoreSlim maxQueuedActionsSemaphore, CancellationToken cancellationToken, bool continueOnCapturedContext) { if (await maxQueuedActionsSemaphore.WaitAsync(TimeSpan.Zero, cancellationToken).ConfigureAwait(continueOnCapturedContext)) try { await maxParallelizationSemaphore.WaitAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext); try { return await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext); } finally { maxParallelizationSemaphore.Release(); } } finally { maxQueuedActionsSemaphore.Release(); } await onBulkheadRejectedAsync(context).ConfigureAwait(continueOnCapturedContext); throw new BulkheadRejectedException(); } } }