使用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);
关键修正点说明
- 策略入口类:必须从
Policy静态类开始构建策略,而非直接使用AsyncPolicy抽象类,HandleResult是Policy类提供的用于定义「基于返回结果触发重试」的方法。 - 异步重试方法:针对异步方法的重试,需要使用
WaitAndRetryAsync而非同步版本的WaitAndRetry,这样才能生成适配异步场景的AsyncRetryPolicy<T>。 - 重试回调适配:异步策略的重试回调使用
onRetryAsync参数,要求返回Task,如果是同步逻辑可以直接返回Task.CompletedTask。 - 异步结果获取:
ExecuteAsync方法返回的是Task<T>,必须通过await才能拿到实际的SomeData对象,否则得到的是未完成的任务实例。
内容的提问来源于stack exchange,提问作者gilpach
相关产品推荐
相关产品推荐

