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

AsyncPolicyWrap<TResult>

public class AsyncPolicyWrap<TResult> : AsyncPolicy<TResult>, IPolicyWrap<TResult>, IPolicyWrap, IsPolicy
A policy that allows two (and by recursion more) async Polly policies to wrap executions of async delegates.
using System; using System.Threading; using System.Threading.Tasks; namespace Polly.Wrap { public class AsyncPolicyWrap<TResult> : AsyncPolicy<TResult>, IPolicyWrap<TResult>, IPolicyWrap, IsPolicy { private readonly IAsyncPolicy _outerNonGeneric; private readonly IAsyncPolicy _innerNonGeneric; private readonly IAsyncPolicy<TResult> _outerGeneric; private readonly IAsyncPolicy<TResult> _innerGeneric; public IsPolicy Outer { get { IsPolicy outerGeneric = _outerGeneric; return outerGeneric ?? _outerNonGeneric; } } public IsPolicy Inner { get { IsPolicy innerGeneric = _innerGeneric; return innerGeneric ?? _innerNonGeneric; } } internal override void SetPolicyContext(Context executionContext, out string priorPolicyWrapKey, out string priorPolicyKey) { priorPolicyWrapKey = executionContext.PolicyWrapKey; priorPolicyKey = executionContext.PolicyKey; if (executionContext.PolicyWrapKey == null) executionContext.PolicyWrapKey = base.PolicyKey; base.SetPolicyContext(executionContext, out string _, out string _); } internal AsyncPolicyWrap(AsyncPolicy outer, IAsyncPolicy<TResult> inner) : base(outer.ExceptionPredicates, ResultPredicates<TResult>.None) { _outerNonGeneric = outer; _innerGeneric = inner; } internal AsyncPolicyWrap(AsyncPolicy<TResult> outer, IAsyncPolicy inner) : base(outer.ExceptionPredicates, outer.ResultPredicates) { _outerGeneric = outer; _innerNonGeneric = inner; } internal AsyncPolicyWrap(AsyncPolicy<TResult> outer, IAsyncPolicy<TResult> inner) : base(outer.ExceptionPredicates, outer.ResultPredicates) { _outerGeneric = outer; _innerGeneric = inner; } protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) { if (_outerNonGeneric != null) { if (_innerNonGeneric != null) return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerNonGeneric, _innerNonGeneric, cancellationToken); if (_innerGeneric != null) return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerNonGeneric, _innerGeneric, cancellationToken); throw new InvalidOperationException("A AsyncPolicyWrap must define an inner policy."); } if (_outerGeneric != null) { if (_innerNonGeneric != null) return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerGeneric, _innerNonGeneric, cancellationToken); if (_innerGeneric != null) return AsyncPolicyWrapEngine.ImplementationAsync<TResult>(action, context, continueOnCapturedContext, _outerGeneric, _innerGeneric, cancellationToken); throw new InvalidOperationException("A AsyncPolicyWrap must define an inner policy."); } throw new InvalidOperationException("A AsyncPolicyWrap must define an outer policy."); } } }