AsyncBulkheadEngine
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Bulkhead
{
internal static class AsyncBulkheadEngine
{
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();
}
}
}