C# 如果发生异常,Polly framework CircuitBreakerAsync不会重试
我正在使用Polly框架进行瞬时故障处理。对于同步操作,Polly断路器策略工作正常,但当我创建其异步版本时,它不会重试执行。请建议: 异步方法:C# 如果发生异常,Polly framework CircuitBreakerAsync不会重试,c#,async-await,circuit-breaker,polly,C#,Async Await,Circuit Breaker,Polly,我正在使用Polly框架进行瞬时故障处理。对于同步操作,Polly断路器策略工作正常,但当我创建其异步版本时,它不会重试执行。请建议: 异步方法: private async static Task HelloWorld() { if (DateTime.Now < programStartTime.AddSeconds(10)) { Console.WriteLine("Task Failed.");
private async static Task HelloWorld()
{
if (DateTime.Now < programStartTime.AddSeconds(10))
{
Console.WriteLine("Task Failed.");
throw new TimeoutException();
}
await Task.Delay(TimeSpan.FromSeconds(1));
Console.WriteLine("Task Completed.");
}
private异步静态任务HelloWorld()
{
if(DateTime.Now
Polly断路器异步策略:
private static void AsyncDemo3(Func<Task> action)
{
programStartTime = DateTime.Now;
Policy policy = Policy
.Handle<TimeoutException>()
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(2));
try
{
var a = policy.ExecuteAndCaptureAsync(action, true).GetAwaiter().GetResult();
}
catch (AggregateException ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
private static void AsyncDemo3(Func操作)
{
programStartTime=DateTime.Now;
策略=策略
.Handle()
.CircuitBreakerAsync(3,从秒开始的时间跨度(2));
尝试
{
var a=policy.executeAndCaptureAync(action,true).GetAwaiter().GetResult();
}
捕获(聚合异常)
{
Console.WriteLine(“异常:+ex.Message”);
}
捕获(例外情况除外)
{
Console.WriteLine(“异常:+ex.Message”);
}
}
执行波利断路器策略:
AsyncDemo3(HelloWorld)
请帮助客户发现并解决问题。我相信您误解了断路器政策的作用 它所做的是,如果按给定的次数调用它,并且每次都失败,那么它将在一段时间内停止调用给定的方法。但它不会自己重试 所以要做我认为你想做的事情,你需要结合重试策略和断路器策略。一种方法是:
Policy retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3);
Policy circuitBreakerPolicy = Policy
.Handle<TimeoutException>()
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(2));
try
{
retryPolicy.ExecuteAsync(() => circuitBreakerPolicy.ExecuteAsync(action, true))
.GetAwaiter().GetResult();
}
…
建议创建这两个策略并使用以下方法组合相同的策略 策略创建
var circuitBreakerPolicy = Policy
.Handle<TimeoutException>()
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(2));
var retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3);
// Combined policy: outermost first, innermost last
var policy = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);
Polly现在还添加了可以使组合策略的语法更加简洁的语法:retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(…)
var circuitBreakerPolicy = Policy
.Handle<TimeoutException>()
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(2));
var retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3);
// Combined policy: outermost first, innermost last
var policy = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);
await this.policy.ExecuteAsync(async () => await SomeFooMethodAsync(cancellationToken));