- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试检查 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
之外的代表。因此,它不会触发重试。
_retryPolicy.Execute(() =>
{
Console.WriteLine(i);
i++;
int.Parse("something");
});
通过删除 async
,您的代表将是 Action
这将抛出 FormatException
这可能会触发重试策略。
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/
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我想创建一个可以从尽可能多的错误中恢复的函数,然后再试一次。当然,有意义的错误处理包含在程序的其他部分——这是保持运行的最后努力。所以我写了这个: retryForever prog = catchA
我是一名优秀的程序员,十分优秀!