<PackageReference Include="Polly.Core" Version="8.0.0-alpha.1" />

ReloadableResilienceStrategy

using Polly.Telemetry; using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Polly.Utils { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal sealed class ReloadableResilienceStrategy : ResilienceStrategy { [System.Runtime.CompilerServices.Nullable(0)] internal readonly struct ReloadFailedArguments : IEquatable<ReloadFailedArguments> { public Exception Exception { get; set; } public ReloadFailedArguments(Exception Exception) { Exception = Exception; } [System.Runtime.CompilerServices.NullableContext(0)] [CompilerGenerated] public override string ToString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("ReloadFailedArguments"); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) stringBuilder.Append(' '); stringBuilder.Append('}'); return stringBuilder.ToString(); } [System.Runtime.CompilerServices.NullableContext(0)] [CompilerGenerated] private bool PrintMembers(StringBuilder builder) { builder.Append("Exception = "); builder.Append(Exception); return true; } public static bool operator !=(ReloadFailedArguments left, ReloadFailedArguments right) { return !(left == right); } public static bool operator ==(ReloadFailedArguments left, ReloadFailedArguments right) { return left.Equals(right); } [CompilerGenerated] public override int GetHashCode() { return EqualityComparer<Exception>.Default.GetHashCode(Exception); } [System.Runtime.CompilerServices.NullableContext(0)] [CompilerGenerated] public override bool Equals(object obj) { if (obj is ReloadFailedArguments) return Equals((ReloadFailedArguments)obj); return false; } [CompilerGenerated] public bool Equals(ReloadFailedArguments other) { return EqualityComparer<Exception>.Default.Equals(Exception, other.Exception); } [CompilerGenerated] public void Deconstruct(out Exception Exception) { Exception = this.Exception; } } public const string StrategyName = "ReloadableStrategy"; public const string StrategyType = "ReloadableStrategy"; public const string ReloadFailedEvent = "ReloadFailed"; private readonly Func<CancellationToken> _onReload; private readonly Func<ResilienceStrategy> _resilienceStrategyFactory; private readonly ResilienceStrategyTelemetry _telemetry; private CancellationTokenRegistration _registration; public ResilienceStrategy Strategy { get; set; } public ReloadableResilienceStrategy(ResilienceStrategy initialStrategy, Func<CancellationToken> onReload, Func<ResilienceStrategy> resilienceStrategyFactory, ResilienceStrategyTelemetry telemetry) { Strategy = initialStrategy; _onReload = onReload; _resilienceStrategyFactory = resilienceStrategyFactory; _telemetry = telemetry; RegisterOnReload(default(CancellationToken)); } [return: System.Runtime.CompilerServices.Nullable(new byte[] { 0, 0, 1 })] protected internal override ValueTask<Outcome<TResult>> ExecuteCoreAsync<[System.Runtime.CompilerServices.Nullable(2)] TResult, [System.Runtime.CompilerServices.Nullable(2)] TState>([System.Runtime.CompilerServices.Nullable(new byte[] { 1, 1, 1, 0, 0, 1 })] Func<ResilienceContext, TState, ValueTask<Outcome<TResult>>> callback, ResilienceContext context, TState state) { return Strategy.ExecuteCoreAsync(callback, context, state); } private void RegisterOnReload(CancellationToken previousToken) { CancellationToken token = _onReload(); if (!(token == previousToken)) _registration = token.Register(delegate { try { Strategy = _resilienceStrategyFactory(); } catch (Exception exception) { ResilienceContext context = ResilienceContext.Get().Initialize<VoidResult>(true); OutcomeArguments<VoidResult, ReloadFailedArguments> args = new OutcomeArguments<VoidResult, ReloadFailedArguments>(context, new Outcome<VoidResult>(exception), new ReloadFailedArguments(exception)); _telemetry.Report("ReloadFailed", args); ResilienceContext.Return(context); } _registration.Dispose(); RegisterOnReload(token); }); } } }