Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果发生异常,Polly framework CircuitBreakerAsync不会重试_C#_Async Await_Circuit Breaker_Polly - Fatal编程技术网

C# 如果发生异常,Polly framework CircuitBreakerAsync不会重试

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.");

我正在使用Polly框架进行瞬时故障处理。对于同步操作,Polly断路器策略工作正常,但当我创建其异步版本时,它不会重试执行。请建议:

异步方法

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));