using Polly.CircuitBreaker;
using System.Threading.Tasks;
using System.Collections.Generic;
private static async Task Main(string[] args)
Console.WriteLine("Run the below samples by uncommenting the lines");
private static async Task BasicAsync()
var circuitBreakerPolicy = Policy
.CircuitBreakerAsync(2, TimeSpan.FromSeconds(1));
for (int i = 0; i < 10; ++i)
Console.WriteLine($"Execution {i}");
await circuitBreakerPolicy.ExecuteAsync(async () =>
Console.WriteLine($"before throw exception {i}");
throw new Exception($"Error {i}");
Console.WriteLine($"Catch ex {ex.Message}");
public static async Task AdvancedAsync()
var advancedCircuitBreaker =Policy
.AdvancedCircuitBreakerAsync(0.5, TimeSpan.FromSeconds(2),
3, TimeSpan.FromSeconds(1));
for (int i = 0; i < 10; i++)
Console.WriteLine($"Execution {i}");
await advancedCircuitBreaker.ExecuteAsync(async () =>
Console.WriteLine($"before throw exception {i}");
throw new Exception($"Error {i}");
Console.WriteLine($"Catch ex {ex.Message}");
public static async Task TimeoutConsequenceAsync()
var advancedCircuitBreaker=Policy
.AdvancedCircuitBreakerAsync(1, TimeSpan.FromSeconds(3),
2, TimeSpan.FromSeconds(1));
var timeoutPolicy = Policy.TimeoutAsync
(TimeSpan.FromMilliseconds(1000),
TimeoutStrategy.Pessimistic);
var wrapPolicy=Policy.WrapAsync(advancedCircuitBreaker, timeoutPolicy);
for (int i = 0; i < 10; i++)
Console.WriteLine($"Execution {i}");
await wrapPolicy.ExecuteAsync(async () =>
Console.WriteLine($"before throw exception {i}");
await Task.Delay(TimeSpan.FromMilliseconds(1000));
Console.WriteLine($"after throw exception {i}");
Console.WriteLine($"Execution {i} after actual call");
Console.WriteLine($"Catch ex {ex.Message}");
public static async Task FallbackWithTimeoutAsync()
var advancedCircuitBreaker = Policy
.AdvancedCircuitBreakerAsync(0.5, TimeSpan.FromSeconds(2),
3, TimeSpan.FromSeconds(1));
var timeoutPolicy = Policy.TimeoutAsync
(TimeSpan.FromMilliseconds(1000),
TimeoutStrategy.Pessimistic);
.Handle<BrokenCircuitException>()
.Or<AggregateException>()
.Or<TimeoutRejectedException>()
.FallbackAsync((cancellation) =>
Console.WriteLine("Fallback action");
return Task.CompletedTask;
var wrapPolicy = Policy.WrapAsync(fallback,
advancedCircuitBreaker, timeoutPolicy);
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
tasks.Add(wrapPolicy.ExecuteAsync(async () =>
Console.WriteLine($"before wait {i}");
await Task.Delay(TimeSpan.FromMilliseconds(3500));
Console.WriteLine($"after wait {i}");
catch (AggregateException ex)
Console.WriteLine($"Catch ex {ex.Message}");
await Task.WhenAll(tasks);
catch (AggregateException)
var errors = tasks.Where(t => t.Exception != null).Select
foreach (var error in errors)
Console.WriteLine($"ERROR is {error.Message} {error.GetType()}");