如何用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
相关产品推荐
相关产品推荐

