BulkheadPolicy<TResult>
A bulkhead-isolation policy which can be applied to delegates returning a value of type .
using Polly.Utilities;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Bulkhead
{
public class BulkheadPolicy<TResult> : Policy<TResult>, IDisposable
{
private readonly SemaphoreSlim _maxParallelizationSemaphore;
private readonly SemaphoreSlim _maxQueuedActionsSemaphore;
private readonly int _maxParallelization;
private readonly int _maxQueueingActions;
public int BulkheadAvailableCount => _maxParallelizationSemaphore.CurrentCount;
public int QueueAvailableCount => Math.Min(_maxQueuedActionsSemaphore.CurrentCount, _maxQueueingActions);
internal BulkheadPolicy(Func<Func<CancellationToken, TResult>, Context, CancellationToken, TResult> executionPolicy, int maxParallelization, int maxQueueingActions, SemaphoreSlim maxParallelizationSemaphore, SemaphoreSlim maxQueuedActionsSemaphore)
: base(executionPolicy, PredicateHelper.EmptyExceptionPredicates, PredicateHelper<TResult>.EmptyResultPredicates)
{
_maxParallelization = maxParallelization;
_maxQueueingActions = maxQueueingActions;
_maxParallelizationSemaphore = maxParallelizationSemaphore;
_maxQueuedActionsSemaphore = maxQueuedActionsSemaphore;
}
public void Dispose()
{
_maxParallelizationSemaphore.Dispose();
_maxQueuedActionsSemaphore.Dispose();
}
internal BulkheadPolicy(Func<Func<CancellationToken, Task<TResult>>, Context, CancellationToken, bool, Task<TResult>> asyncExecutionPolicy, int maxParallelization, int maxQueueingActions, SemaphoreSlim maxParallelizationSemaphore, SemaphoreSlim maxQueuedActionsSemaphore)
: base(asyncExecutionPolicy, PredicateHelper.EmptyExceptionPredicates, PredicateHelper<TResult>.EmptyResultPredicates)
{
_maxParallelization = maxParallelization;
_maxQueueingActions = maxQueueingActions;
_maxParallelizationSemaphore = maxParallelizationSemaphore;
_maxQueuedActionsSemaphore = maxQueuedActionsSemaphore;
}
}
}