Polly by Michael Wolfenden, App vNext

<PackageReference Include="Polly" Version="5.9.0" />

 Polly 5.9.0

Polly is a .NET 4.5 / .NET Standard 1.1 library that allows developers to express resilience and transient fault handling policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation and Fallback in a fluent and thread-safe manner.

<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
    <authors>Michael Wolfenden, App vNext</authors>
    <owners>App vNext</owners>
    <description>Polly is a .NET 4.5 / .NET Standard 1.1 library that allows developers to express resilience and transient fault handling policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation and Fallback in a fluent and thread-safe manner.</description>
    <releaseNotes>v5.0 is a major release with significant new resilience policies: Timeout; Bulkhead Isolation; Fallback; Cache; and PolicyWrap.  See release notes back to v5.0.0 for full details.

     - Allow Timeout.InfiniteTimeSpan (no timeout) for TimeoutPolicy. 
     - Add .AsPolicy&lt;TResult&gt; and .AsAsyncPolicy&lt;TResult&gt; methods for converting non-generic policies to generic policies.
     - Per Semver, indicates deprecation of overloads and properties intended to be removed or renamed in Polly v6.

     - Add a new onBreak overload that provides the prior state on a transition to an open state
     - Bug fix: RelativeTtl in CachePolicy now always returns a ttl relative to time item is cached
     - Minor cache fixes
     - Add ability to calculate cache Ttl based on item to cache
     - Allow user-created custom policies

     - Extend PolicyWrap syntax with interfaces

     - Add ability to handle inner exceptions natively: .HandleInner&lt;TEx&gt;()
     - Allow WaitAndRetry policies to calculate wait based on the handled fault
     - Add the ability to access the policies within an IPolicyWrap
     - Allow PolicyWrap to take interfaces as parameters
     - Bug fix: set context keys for generic execute method with PolicyWrap
     - Bug fix: generic TResult method with non-generic fallback policy
     - Performance improvements

     - Bug fix: non-generic CachePolicy with PolicyWrap
     - Add Cache interfaces
     - Add CachePolicy: cache-aside pattern, with interfaces for pluggable cache providers and serializers.
     - Bug fix: Sync TimeoutPolicy in pessimistic mode no longer interposes AggregateException.
     - Provide public factory methods for PolicyResult, to support testing.
     - Fallback delegates can now take handled fault as input parameter.

     - Make ISyncPolicy&lt;TResult&gt; public
     - (Upgrade solution to msbuild15)

     - Fix ExecuteAndCapture() usage with PolicyWrap   
     - Allow Fallback delegates to take execution Context
     - Provide IReadOnlyPolicyRegistry interface

     - Add PolicyRegistry for storing and retrieving policies.
     - Add interfaces by policy type and execution type.
     - Change .NetStandard minimum support to NetStandard1.1.

     - Allow different parts of a policy execution to exchange data via a mutable Context travelling with each execution.

     - Update NETStandard.Library dependency to latest 1.6.1 for .NetStandard1.0 target.  Resolves compatibility for some Xamarin targets.

     - Bug fix: Prevent request stampede during half-open state of CircuitBreaker and AdvancedCircuitBreaker.  Enforce only one new trial call per break duration, during half-open state.
     - Bug fix: Prevent duplicate raising of the onBreak delegate, if executions started when a circuit was closed, return faults when a circuit has already opened.
     - Optimisation: Optimise hotpaths for Circuit-Breaker, Retry and Fallback policies.
     - Add NoOpPolicy: NoOpPolicy executes delegates without intervention; for eg stubbing out Polly in unit testing.

     5.0.4 pre
     - (.NET40Async package changes only)

     5.0.3 RTM
     - Refine implementation of cancellable synchronous WaitAndRetry
     - Minor breaking change: Where a user delegate does not observe cancellation, Polly will now honour the delegate's outcome rather than throw for the unobserved cancellation (issue 188).

     5.0.2 alpha
     - .NETStandard1.0 target: Correctly state dependencies. 
     - .NETStandard1.0 target: Fix SemVer stamping of Polly.dll.
     - PCL259 project and target: Remove, in favour of .NETStandard1.0 target.  PCL259 targets are still supported, via .NETStandard1.0 target.
     - Mark Polly.dll as CLSCompliant.
     5.0.1 alpha
     - Add a .NETStandard1.0 target.

     5.0.0 alpha
     A major release, adding significant new resilience policies:
     - Timeout policy: allows timing out any execution
     - Bulkhead isolation policy: limits the resources consumable by governed actions, such that a faulting channel cannot cause cascading failures.
     - Fallback policy: provides for a fallback execution or value, in case of overall failure
     - PolicyWrap: allows flexibly combining Policy instances of any type, to form an overall resilience strategy.

     Other changes include:
     - Add PolicyKeys and context to all policy executions, for logging and to support later introduction of policy events and metrics. 
     - Add CancellationToken support to synchronous executions.
     - Add some missing ExecuteAndCapture/Async overloads. 
     - Remove invalid ExecuteAsync overloads taking (but not making use of) a CancellationToken
     - Provide .NET4.0 support uniquely through Polly.NET40Async package
     - Retire ContextualPolicy (not part of documented API; support now in Policy base class)
     - Discontinue .NET3.5 support

     - Added ability for policies to handle return results.  Optimised circuit-breaker hot path.  Fixed circuit-breaker threshold bug.  
     - Added overloads to WaitAndRetry and WaitAndRetryAsync methods that accept an onRetry delegate which includes the attempt count.
     - Cleaned up new Polly.Net40Async NuGet package, removing Polly.dll and unused framework folders.
     - Add new Polly.Net40Async project supporting async for .NET40 via Microsoft.Bcl.Async.  This is available as separate Nuget packages Polly.Net40Async and Polly.Net40Async-signed.

     - Allowed async onRetry delegates to async retry policies.

     - Added AdvancedCircuitBreaker - Thanks to @reisenberger and @kristianhald
     - Fixed an issue with the onReset delegate of the CircuitBreaker.
     - Add ExecuteAndCapture support with arbitrary context data - Thanks to @reisenberger
     - Add Wait and retry forever policy - Thanks to @nedstoyanov 
     - Remove time-limit on CircuitBreaker state-change delegates - Thanks to @reisenberger 
     - Add async support and circuit-breaker support for ContextualPolicy 
     - Add manual control of circuit-breaker (reset and manual circuit isolation) 
     - Add public reporting of circuit-breaker state, for health/performance monitoring 
     - Add delegates on changes of circuit state - Thanks to @reisenberger 
     - Add cancellation support for all async Policy execution - Thanks to @reisenberger 
     - Fixes an issue where continueOnCapturedContext needed to be specified in two places (on action execution and Policy configuration), when wanting to flow async action execution on the captured context - Thanks to @reisenberger 
     - Fixes excess line ending issues 
     - Async sleep fix, plus added continueOnCapturedContext parameter on async methods to control whether continuation and retry will run on captured synchronization context - Thanks to @yevhen 
     - Policies with a retry count of zero are now allowed
     - Add .NET Core support
     - Fix PCL implementation of `SystemClock.Reset`
     - Added ability to capture the results of executing a policy via `ExecuteAndCapture`
     - Added extra `NotOnCapturedContext` call to prevent potential deadlocks when blocking on asynchronous calls
     - Replaced non-blocking sleep implementation with a blocking one for PCL
     - Added Async Support (PCL)
     - PCL Profile updated from Profile78 -&gt;  Profile 259
     - Added missing WaitAndRetryAsync overload
     - Added Async Support (.NET Framework 4.5 Only)
     - Added Portable Class Library
     - The "Polly" NuGet package is now no longer strongly named. The strongly named NuGet package is now "Polly-Signed"
     - Added additional overloads to Retry
     - Allow arbitrary data to be passed to policy execution</releaseNotes>
    <copyright>Copyright © 2018, App vNext</copyright>
    <tags>Exception Handling Resilience Transient Fault Policy Circuit Breaker CircuitBreaker Retry Wait Cache Cache-aside Bulkhead Fallback Timeout Throttle Parallelization</tags>
      <group targetFramework=".NETFramework4.5" />
      <group targetFramework=".NETStandard1.1">
        <dependency id="NETStandard.Library" version="1.6.1" />