如何使用 Polly 实现重试逻辑,无限次地重试执行一个函数并添加延迟,但不处理任何异常。场景是重复获取状态信息,但没有预期的异常。
如何使用 Polly 实现重试逻辑,无限次地重试执行一个函数并添加延迟,但不处理任何异常。场景是重复获取状态信息,但没有预期的异常。
如果两次执行之间的延迟足够长,您希望在执行之间释放执行资源(线程或堆栈),请考虑:
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 jobs的工具。
但是如果你真的想使用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
.Handle<Exception>(e => false)
是不正确的;它不会多次调用成功的任务。Polly的重试架构旨在重试单个操作以实现成功,而不是重复调用已成功的事物。我猜测Polly团队不太可能将Polly扩展为cron作业工具,因为这开始超出了Polly对弹性的核心关注点 - 并且还有其他cron作业类型的解决方案可用。感谢您的问题,这有助于澄清这个维度。 - mountain traveller