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

时间:2018-08-14 19:48:10

标签: c# polly retry-logic

如何使用polly实施重试逻辑,以重试永久性地永久执行某个函数,但不处理任何异常。这种情况是反复获取状态信息,但没有预期的例外。

2 个答案:

答案 0 :(得分:2)

Polly并非被设计为Cron-job工具,并且故意不针对该用例。 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之类的定期作业调度程序的一个优点是,如果其中一个执行崩溃,则下一个调度的调用仍将运行。无论采用哪种解决方案,都应该考虑如果定期作业的一次执行失败会发生什么情况。

答案 1 :(得分:0)

您最好使用适用于 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