internal static async Task <TResult> ImplementationAsync <TResult>( Func <Context, CancellationToken, Task <TResult> > action, Context context, Func <Context, Task> onBulkheadRejectedAsync, SemaphoreSlimDynamic maxParallelizationSemaphore, SemaphoreSlimDynamic maxQueuedActionsSemaphore, CancellationToken cancellationToken, bool continueOnCapturedContext) { if (!await maxQueuedActionsSemaphore.WaitAsync(TimeSpan.Zero, cancellationToken).ConfigureAwait(continueOnCapturedContext)) { await onBulkheadRejectedAsync(context).ConfigureAwait(continueOnCapturedContext); throw new BulkheadRejectedException(); } try { await maxParallelizationSemaphore.WaitAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext); try { return(await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext)); } finally { maxParallelizationSemaphore.Release(); } } finally { maxQueuedActionsSemaphore.Release(); } }
internal static TResult Implementation <TResult>( Func <Context, CancellationToken, TResult> action, Context context, Action <Context> onBulkheadRejected, SemaphoreSlimDynamic maxParallelizationSemaphore, SemaphoreSlimDynamic maxQueuedActionsSemaphore, CancellationToken cancellationToken) { if (!maxQueuedActionsSemaphore.Wait(TimeSpan.Zero, cancellationToken)) { onBulkheadRejected(context); throw new BulkheadRejectedException(); } try { maxParallelizationSemaphore.Wait(cancellationToken); try { return(action(context, cancellationToken)); } finally { maxParallelizationSemaphore.Release(); } } finally { maxQueuedActionsSemaphore.Release(); } }