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

使用Polly重试策略时如何在首次执行和每次重试时调用指定方法

问题原因说明

你当前代码里FirstAndRetryMethod放在WaitAndRetry的onRetry回调中,这个回调仅在触发重试规则、等待下一次执行前才会调用,首次执行没有触发故障的话自然不会运行。

解决方案

方案1:直接在执行委托内前置调用(最推荐,实现最简单)

把FirstAndRetryMethod的调用放到Execute委托的最开头,这样首次执行、每次重试后的重新执行都会先触发该方法,完全符合需求。
另外注意你原有代码有两个小问题:

  • Excecute拼写错误,正确写法是Execute
  • Execute方法返回的是DoSomething的执行结果,不能赋值给原来的policy变量,两者类型不匹配

修正后的完整代码如下:

var policy = Policy
    .Handle<DatabaseException>(x => x.DatabaseErrors.ContainsKey(2601))
    .WaitAndRetry(new[]
    {
        TimeSpan.FromMilliseconds(500),
        TimeSpan.FromMilliseconds(1000),
        TimeSpan.FromMilliseconds(1500)
    }, (exception, timeSpan) => {
        // 这里可以保留重试专属逻辑,比如打印异常日志、统计重试次数等
    });

// 如果DoSomething有返回值,用对应类型的变量接收即可
policy.Execute(() => 
{
    FirstAndRetryMethod();
    DoSomething();
});

方案2:绑定到策略中复用

如果你需要在多个地方复用这个「执行前先调用FirstAndRetryMethod」的逻辑,不想每次写Execute都手动加,可以封装统一的执行逻辑:

// 定义重试策略
var retryPolicy = Policy
    .Handle<DatabaseException>(x => x.DatabaseErrors.ContainsKey(2601))
    .WaitAndRetry(new[]
    {
        TimeSpan.FromMilliseconds(500),
        TimeSpan.FromMilliseconds(1000),
        TimeSpan.FromMilliseconds(1500)
    });

// 封装带前置调用的执行逻辑,可全局复用
void ExecuteWithPreprocess(Action action)
{
    retryPolicy.Execute(() =>
    {
        FirstAndRetryMethod();
        action();
    });
}

// 调用时直接传入业务方法即可
ExecuteWithPreprocess(DoSomething);

内容的提问来源于stack exchange,提问作者Ivan-Mark Debono

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:09:03