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

使用Polly配置Async方法1次200ms条件重试时遇HandleResult方法不存在问题

解决Polly异步结果重试策略的定义问题

你的代码报错是因为AsyncPolicy类本身没有HandleResult方法,正确的做法是通过Policy静态类来构建基于返回结果的异步重试策略,以下是修正后的完整实现:

修正后的重试策略

AsyncRetryPolicy<SomeData> retryPolicy = Policy
    .HandleResult<SomeData>(s => !s.IsCorrect)
    .WaitAndRetryAsync(1,
        // 重试间隔提供器
        sleepDurationProvider: (retryCount, response, context) => TimeSpan.FromMilliseconds(200),
        // 重试回调(异步版本)
        onRetryAsync: (response, timeSpan, retryCount, context) =>
        {
            Console.WriteLine($"收到不正确的响应,正在进行第 {retryCount} 次重试");
            return Task.CompletedTask;
        });

待修饰方法(无需修改)

private static async Task<SomeData> ExecuteTask()
{
    return new SomeData() { IsCorrect = false };
}

修正后的执行代码

注意ExecuteAsync返回的是Task<SomeData>,需要使用await获取最终结果:

var rslt = await retryPolicy.ExecuteAsync(async () => 
    await ExecuteTask().ConfigureAwait(false)
);

// 或者更简洁的写法
// var rslt = await retryPolicy.ExecuteAsync(ExecuteTask);

关键修正点说明

  1. 策略入口类:必须从Policy静态类开始构建策略,而非直接使用AsyncPolicy抽象类,HandleResult是Policy类提供的用于定义「基于返回结果触发重试」的方法。
  2. 异步重试方法:针对异步方法的重试,需要使用WaitAndRetryAsync而非同步版本的WaitAndRetry,这样才能生成适配异步场景的AsyncRetryPolicy<T>。
  3. 重试回调适配:异步策略的重试回调使用onRetryAsync参数,要求返回Task,如果是同步逻辑可以直接返回Task.CompletedTask。
  4. 异步结果获取:ExecuteAsync方法返回的是Task<T>,必须通过await才能拿到实际的SomeData对象,否则得到的是未完成的任务实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:05:53