using Polly.CircuitBreaker;
const int numberOfTimesToRetry = 20;
const int numberOfFailures = 5;
public static void Main()
var circuitBreaker = Policy
.Handle<InvalidOperationException>()
exceptionsAllowedBeforeBreaking: 3,
durationOfBreak: TimeSpan.FromMilliseconds(100),
onBreak: (e, span) => Console.WriteLine("Breaking circuit for " + span.TotalMilliseconds + "ms due to " + e.Message ),
onReset: () => Console.WriteLine("Trial call succeeded: circuit closing again."),
onHalfOpen: () => Console.WriteLine("Circuit break time elapsed. Circuit now half open: permitting a trial call.")
.Handle<InvalidOperationException>()
.Or<BrokenCircuitException>()
retryCount: numberOfTimesToRetry,
sleepDurationProvider: i => TimeSpan.FromMilliseconds(20),
onRetry: (e, span, i, ctx) => Console.WriteLine((e is BrokenCircuitException ? "Failed fast" : "Retrying") + " due to " + e.Message + " Waiting " + span.TotalMilliseconds + "ms first. Try " + i + " next.")
string result = retryPolicy.Wrap(circuitBreaker).Execute(() => GetJson());
Console.WriteLine("Got result: " + result);
public static string GetJson()
if (tries++ <= numberOfFailures)
throw new InvalidOperationException("Something went wrong.");
return "SomeProperty: \"some interesting value\"";