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();
}
}
}