为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Polly 库实现重试逻辑,无需重复处理异常

使用 Polly 库实现重试逻辑,无需重复处理异常

C#
汪汪一只猫 2021-11-28 17:54:44
如何使用 polly 实现重试逻辑以重试永远执行一个函数但有一些延迟但不处理异常。该场景是重复获取状态信息,但没有预期的异常。
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

Polly 并非设计为 Cron 作业工具,并且有意不针对该用例。Polly 的重试重点是单个操作的弹性(重试直到成功)而不是重复调用成功的东西)。


对于其他选项(如果有用):

如果执行之间的延迟足以在执行之间释放执行资源(线程或堆栈),请考虑:


如果延迟足够小(比如每 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)的一个优点是,如果其中一个执行崩溃,下一个调度调用仍将运行。无论您采用何种解决方案,您都应该考虑如果定期作业的一次执行失败,您希望发生什么。


查看完整回答
反对 回复 2021-11-28
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您最好使用适用于像 Hangfire 这样的 CRON 作业的东西。


但万一你真的想和波莉一起做。这是您如何做到的。


 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


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信