You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Polly在C#中先指数重试3次后切换为每小时重试?

实现先指数重试后每小时重试的Polly策略

完全可以实现,而且不用复杂的Policy Wrap嵌套,直接通过自定义重试等待逻辑就能精准满足需求。之前用Policy Wrap没达到预期,大概率是因为Wrap的嵌套逻辑会让外层重试重复触发内层的指数重试流程,不符合你“先耗尽n次指数重试,再切换为每小时重试”的诉求。

核心实现代码

直接定义一个RetryPolicy,根据重试次数动态返回等待时间:

// 配置参数:前n次重试用指数退避,之后每小时重试一次
int maxExponentialRetries = 3; // 替换为你需要的n值

var hybridRetryPolicy = Policy
    .Handle<Exception>() // 替换为你要捕获的具体异常类型,比如HttpRequestException
    .WaitAndRetryForever(retryAttempt =>
    {
        // 前maxExponentialRetries次重试:指数退避(第1次等2s,第2次4s,第3次8s...)
        if (retryAttempt <= maxExponentialRetries)
        {
            return TimeSpan.FromSeconds(Math.Pow(2, retryAttempt));
        }
        // 超过n次后:固定每小时重试一次
        else
        {
            return TimeSpan.FromHours(1);
        }
    });

使用示例

将你的业务逻辑传入策略执行即可:

hybridRetryPolicy.Execute(() =>
{
    // 这里放置可能失败的操作,比如远程API调用、数据库写入等
    YourRiskyOperation();
});

可选调整

  • 如果不需要无限重试,可将WaitAndRetryForever替换为WaitAndRetry(totalRetryCount, retryAttempt => ...),指定总重试次数(比如maxExponentialRetries + 5,即前3次指数,后5次每小时)。
  • 指数退避的计算公式可根据需求调整,比如从1s开始:TimeSpan.FromSeconds(Math.Pow(2, retryAttempt - 1))。

内容的提问来源于stack exchange,提问作者eti aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:10:29