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

