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

Polly中WaitAndRetryAsync与WaitAndRetry的区别及适用场景

Polly中WaitAndRetry与WaitAndRetryAsync的区别及适用场景

核心区别

  • 同步/异步属性:WaitAndRetry是同步方法,专门用于包裹同步执行的代码块;WaitAndRetryAsync是异步方法,针对返回Task/Task<T>的异步操作设计。
  • 线程行为:WaitAndRetry会阻塞当前线程,在同一个线程上完成所有重试逻辑;WaitAndRetryAsync则基于异步await机制,等待重试间隔时不会占用线程,避免不必要的资源消耗。
  • 委托类型:WaitAndRetry接收Action或Func<TResult>这类同步委托;WaitAndRetryAsync接收Func<Task>或Func<Task<TResult>>这类异步委托,适配异步操作的签名。

适用场景

  • 同步操作场景:当你需要重试的逻辑是同步执行的(比如本地文件读写、同步数据库查询、无异步接口的第三方服务调用),直接使用WaitAndRetry即可。
    示例代码:

    // 定义同步重试策略:捕获IOException,重试3次,间隔指数退避
    var syncRetryPolicy = Policy
        .Handle<IOException>()
        .WaitAndRetry(3, retryCount => TimeSpan.FromSeconds(Math.Pow(2, retryCount)));
    
    // 执行同步操作
    syncRetryPolicy.Execute(() => 
    {
        // 这里写同步操作逻辑,比如读取本地配置文件
    });
    
  • 异步操作场景:当重试的逻辑是异步的(比如ASP.NET Core中的HTTP客户端调用、异步EF Core数据库操作、返回Task的API接口),必须使用WaitAndRetryAsync。如果在异步场景下误用WaitAndRetry,会强制将异步操作同步阻塞,不仅失去异步优势,还可能导致线程池资源耗尽或死锁问题。
    示例代码:

    // 定义异步重试策略:捕获HttpRequestException,重试3次,间隔指数退避
    var asyncRetryPolicy = Policy
        .Handle<HttpRequestException>()
        .WaitAndRetryAsync(3, retryCount => TimeSpan.FromSeconds(Math.Pow(2, retryCount)));
    
    // 执行异步操作
    await asyncRetryPolicy.ExecuteAsync(async () => 
    {
        // 这里写异步操作逻辑,比如调用第三方API
        using var client = new HttpClient();
        await client.GetAsync("https://api.example.com/data");
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:06:25