gpt4 book ai didi

c# - Polly RetryForever 没有重试

转载 作者:行者123 更新时间:2023-12-02 01:37:01 24 4
gpt4 key购买 nike

我正在尝试检查 Polly 的简单 RetryForever

class Program
{
public static void Main()
{

int i = 0;
var _retryPolicy = Policy
.Handle<Exception>()
.RetryForever();

_retryPolicy.Execute(async () =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
});

Console.ReadLine();
}
}

您可以看到我创建了一个变量i来跟踪执行次数

异常结果:打印i = 0、1、2等

实际结果:打印 i = 0

最佳答案

我可能会迟到,但让我分享我的智慧。


定义策略时,您必须预先知道您想要装饰同步异步方法/函数。

同步方法的重试策略

Policy
.Handle<Exception>()
.RetryForever();

异步方法的重试策略

Policy
.Handle<Exception>()
.RetryForeverAsync();
  • 在前一种情况下,您有 Execute可以预见的方法
    • Action (无返回值的方法)
    • Func<TResult> (具有 TResult 类型化返回值的方法)
    • 还有十几个其他重载
  • 在后一种情况下,您有 ExecuteAsync可以预见的方法
    • 一个Func<Task> (没有返回值的异步方法)
    • Func<Task<TResult>> (具有 TResult 类型化返回值的异步方法)
    • 还有十几个其他重载

同步功能的重试策略

Policy<int>
.Handle<Exception>()
.RetryForever();

异步函数的重试策略

Policy<int>
.Handle<Exception>()
.RetryForeverAsync();

在这些情况下,您的待装饰代码应返回 int .

所以Execute预计 Func<int>代表

policy.Execute(() => { ... return 42; });

ExecuteAsync预计 Func<Task<int>>代表

await policy.Execute(async () => { ... return Task.FromResult(42); });

返回您的代码

由于您在策略定义期间没有对返回类型进行任何限制,因此您可以传递 Func它返回 Task (Execute(async () => { ...});)。

所以,你的Execute返回 Task这不是 await编辑。

让我们等待

await _retryPolicy.Execute(async () =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
});

如果您await返回的Task那么它会抛出 FormatException 。但是该异常是由 await 引发的位于 Execute 之外的代表。因此,它不会触发重试。

修复选项 A

_retryPolicy.Execute(() =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
});

通过删除 async ,您的代表将是 Action这将抛出 FormatException这可能会触发重试策略。

修复选项 B

var _retryPolicy = Policy<int>
.Handle<Exception>()
.RetryForeverAsync();

await _retryPolicy.ExecuteAsync(async () =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
});

如果您定义了异步方法的策略并且您await ExecuteAsync那么它也会起作用。为什么?因为 ExecuteAsync await s the provided delegate即使您没有将委托(delegate)定义为 async

await _retryPolicy.ExecuteAsync(() =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
return Task.CompletedTask; //This code is never reached
});

关于c# - Polly RetryForever 没有重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72197817/

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