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

