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

Polly Timeout Policy测试不符合预期问题排查与解决

Polly Timeout策略测试失败问题解答

问题原因

是的,测试失败确实和Task.Delay以及你使用的TimeoutStrategy.Optimistic直接相关:

  • TimeoutStrategy.Optimistic是协作式超时策略,它要求被执行的异步代码必须响应CancellationToken(即检查令牌是否已取消,主动终止操作)。
  • 你的测试代码中,Task.Delay虽然支持取消,但你在ExecuteAsync的委托里没有传入Polly提供的取消令牌,导致Task.Delay不会响应超时触发的取消信号,超时策略无法中断任务,自然不会抛出TimeoutRejectedException。
  • 而TimeoutStrategy.Pessimistic是强制中断式超时策略,它会将目标代码放在单独的执行上下文(如线程池任务)中,超时后直接终止该上下文,所以即使代码不响应取消,也能触发超时异常。

解决方法

要让Optimistic策略的测试通过,只需要在委托中接受并传递Polly的取消令牌给Task.Delay,让操作能响应协作式取消:

修改后的测试代码:

[Fact]
public async Task GetTimeoutPolicy_ThrowsTimeoutRejectedException2()
{
    int timeoutSeconds = 1;
    var policy = HttpPolicies.HttpPolicies.GetTimeoutPolicy(timeoutSeconds);

    await policy.Awaiting(p => p.ExecuteAsync(async ct =>
    {
      await Task.Delay(TimeSpan.FromSeconds(2), ct); // 传入Polly提供的取消令牌
      return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
    })).Should().ThrowAsync<TimeoutRejectedException>();
}

额外说明

  • Optimistic策略的设计初衷是配合支持取消的异步操作(比如HttpClient的SendAsync可以传入取消令牌),它的性能开销远低于Pessimistic(不需要额外的线程调度)。
  • 如果你的实际业务代码是不支持取消的操作,那Pessimistic策略会更适合,但要注意它的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:23:19