使用 Polly 库实现重试逻辑,无需重复处理异常
Implementing retry logic with Polly library with no exception handling repeatedly
如何使用 polly 实现重试逻辑,以一定延迟永远重试执行函数但不处理异常。场景是反复获取状态信息,但没有预期的异常。
Polly 并非设计为 Cron-job 工具,因此有意不针对该用例。 Polly 的重试重点是单个操作的弹性(重试直到成功),而不是重复调用确实成功的事情。
其他选项(如果有用):
如果执行之间的延迟足以让您在执行之间释放执行资源(线程或堆栈),请考虑:
- 在经典ASP.NET中,HangFire
等工具
- 在 .NET Core 2.1 中,Background tasks with hosted services
如果延迟足够小(比如每 5 秒一次)以至于不值得释放和重新获取执行资源,您可以简单地使用带有延迟的无限循环。例如,如果异步:
while (true)
{
// Do my repeated work
await Task.Delay(TimeSpan.FromSeconds(5));
}
如果你想取消(优雅地结束一个程序),当然你可以用取消来扩展:
// for some CancellationToken cancellationToken
while (!cancellationToken.IsCancellationRequested)
{
// Do my repeated work
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
HangFire 等周期性作业调度程序的一个优点是,如果其中一个执行崩溃,下一个调度调用仍将 运行。无论您的解决方案是什么,您都应该考虑如果定期作业的一次执行失败您希望发生什么。
你最好使用像 Hangfire 这样的 CRON 任务。
但以防万一你真的想和 Polly 打交道。
以下是您的操作方法。
await Policy
.HandleResult<bool>(c => c == false) //you can add other condition
.WaitAndRetryForeverAsync(i => TimeSpan.FromMinutes(i))
.ExecuteAsync(async () =>
{
await DoSomethingAsync();
return true; //return false to stop execution
});
https://github.com/App-vNext/Polly/wiki/Retry#retry-to-refresh-authorization
如何使用 polly 实现重试逻辑,以一定延迟永远重试执行函数但不处理异常。场景是反复获取状态信息,但没有预期的异常。
Polly 并非设计为 Cron-job 工具,因此有意不针对该用例。 Polly 的重试重点是单个操作的弹性(重试直到成功),而不是重复调用确实成功的事情。
其他选项(如果有用):
如果执行之间的延迟足以让您在执行之间释放执行资源(线程或堆栈),请考虑:
- 在经典ASP.NET中,HangFire 等工具
- 在 .NET Core 2.1 中,Background tasks with hosted services
如果延迟足够小(比如每 5 秒一次)以至于不值得释放和重新获取执行资源,您可以简单地使用带有延迟的无限循环。例如,如果异步:
while (true)
{
// Do my repeated work
await Task.Delay(TimeSpan.FromSeconds(5));
}
如果你想取消(优雅地结束一个程序),当然你可以用取消来扩展:
// for some CancellationToken cancellationToken
while (!cancellationToken.IsCancellationRequested)
{
// Do my repeated work
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
HangFire 等周期性作业调度程序的一个优点是,如果其中一个执行崩溃,下一个调度调用仍将 运行。无论您的解决方案是什么,您都应该考虑如果定期作业的一次执行失败您希望发生什么。
你最好使用像 Hangfire 这样的 CRON 任务。
但以防万一你真的想和 Polly 打交道。 以下是您的操作方法。
await Policy
.HandleResult<bool>(c => c == false) //you can add other condition
.WaitAndRetryForeverAsync(i => TimeSpan.FromMinutes(i))
.ExecuteAsync(async () =>
{
await DoSomethingAsync();
return true; //return false to stop execution
});
https://github.com/App-vNext/Polly/wiki/Retry#retry-to-refresh-authorization