using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
static async Task Main(string[] args)
var groupedObjects = Enumerable.Range(0, 10)
.Select(n => new object[] { n });
var bulkheadPolicy = Policy
var parallelTasks = new List<Task>();
foreach (var set in groupedObjects)
Console.WriteLine(@$"Scheduling, Available: {bulkheadPolicy
.BulkheadAvailableCount}, QueueAvailable: {bulkheadPolicy
var task = bulkheadPolicy.ExecuteAsync(async () =>
await DoSomethingAsync(set).ConfigureAwait(false);
var whenAllTasks = Task.WhenAll(parallelTasks);
catch when (whenAllTasks.IsFaulted)
whenAllTasks.Exception.Handle(ex => ex is BulkheadRejectedException);
Console.WriteLine(@$"Processed: {parallelTasks
.Where(t => t.Status == TaskStatus.RanToCompletion).Count()}");
Console.WriteLine($"Faulted: {parallelTasks.Where(t => t.IsFaulted).Count()}");
static async Task DoSomethingAsync(IEnumerable<object> set)
await Task.Delay(500).ConfigureAwait(false);