c# - 如果发生异常,Polly 的 CircuitBreakerAsync 不会重试

标签 c# async-await circuit-breaker polly

我正在使用 Polly 库处理 transient 故障。对于同步操作,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.");
    }

Polly 断路器异步策略:

private static void AsyncDemo3(Func<Task> action)
    {
        programStartTime = DateTime.Now;

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

执行 Polly 断路器策略:

AsyncDemo3(HelloWorld);

请帮助发现并解决问题。

最佳答案

我相信您误解了断路器政策的作用。

它的作用是,如果调用它给定的次数并且每次都失败,那么它将停止调用给定的方法一段时间。但它不会自行重试。

所以要做我认为你想做的事情,你需要将重试策略和熔断策略结合起来。一种方法是:

AsyncPolicy retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3);

AsyncPolicy circuitBreakerPolicy = Policy
    .Handle<TimeoutException>()
    .CircuitBreakerAsync(3, TimeSpan.FromSeconds(2));

try
{
    retryPolicy.ExecuteAsync(() => circuitBreakerPolicy.ExecuteAsync(action, true))
        .GetAwaiter().GetResult();
}
…

这段代码的输出是:

Task Failed.
Task Failed.
Task Failed.
Exception: The circuit is now open and is not allowing calls.

关于c# - 如果发生异常,Polly 的 CircuitBreakerAsync 不会重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36398713/

相关文章:

c# - AffectedRecords 属性为 -1 但表中没有变化?

c# - Linq 包含运算符

c# - 断路器模式中异常过滤的一些实现是什么?

spring-boot - Resilience4j Retry+Spring Boot 2 application.yml 配置未应用

c# - 讲述人未按预期读取 TextBlock 中的文本。仅在选定的文本框中

c# - 比较大整数列表和小整数列表的最有效方法是什么?

javascript - .then 在异步函数返回值之前被调用

javascript - 异步/等待请求内部 Passport 策略

javascript - 如何在nodejs中同步执行?

c# - 如何使用断路器?