C# Polly策略包装方法 C#如何组合多个Polly策略-C#.Net教程

用 Policy.WrapAsync(或 Wrap)将多个策略按执行顺序嵌套包装,外层控整体(如超时),内层处理细节(如重试、熔断);顺序决定生效优先级,类型须一致,异常为最内层原始异常。

多个Polly策略怎么串起来用

直接说结论:用 Policy.WrapAsync(或 Policy.Wrap)把多个策略按执行顺序“包”成一个,不是简单叠加,而是形成嵌套调用链。外层策略控制整体行为(比如超时),内层策略处理具体异常(比如重试、熔断)。

常见错误是把 RetryPolicy 和 CircuitBreakerPolicy 分开 await,结果重试逻辑完全绕过熔断器;或者误用 .Or() 想合并策略——那只是扩展异常类型匹配,不是组合策略行为。

  • Wrap 的顺序很重要:最外层策略最先生效,最内层策略最接近实际委托。例如 TimeoutPolicy.WrapAsync(RetryPolicy.WrapAsync(CircuitBreakerPolicy)) 表示:先走熔断判断 → 再决定是否重试 → 最后被超时兜底中断
  • 所有被包装的策略必须类型一致:要么全是 AsyncPolicy,要么全是 AsyncPolicy(无返回值)。混用会导致编译失败
  • 如果策略里用了 Context(比如传 "operation-id"),外层策略的 Context 会透传给内层,但各策略的 onRetry / onBreak 回调中拿到的 Context 是同一份引用,注意别意外覆盖

带返回值的异步策略怎么包装

处理 HTTP 调用这类有返回值的场景,必须用泛型版本的 WrapAsync,否则编译不通过。策略声明和包装都得对齐类型。

例如封装一个带熔断 + 重试 + 超时的 HttpClient.GetAsync 调用:

var circuitBreaker = Policy
.Handle()
.CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));

var retry = Policy
.Handle()
.OrResult(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2) });

var timeout = Policy.TimeoutAsync(5);

var wrapped = Policy.WrapAsync(circuitBreaker, retry, timeout); // 注意顺序

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C# Polly策略包装方法 C#如何组合多个Polly策略-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995959+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995959+
  • 本周更新: 0+
  • 最后更新: 2026-03-16