gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:15:46 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com