.NET 8中如何为HttpClient.Send正确使用CancellationToken设置超时
为每个HttpClient.Send调用单独设置超时的正确方式
你遇到的问题核心是:CancellationTokenSource(TimeSpan)的计时器在实例创建时就立即启动,而非等到传入Send方法才开始计时。所以你的测试代码里先执行了Thread.Sleep(2 * timeout),此时令牌已经处于取消状态,调用Send自然直接抛出取消异常。
正确的实现方式
要给单个Send调用设置独立超时,需要在调用Send的前一刻再创建CancellationTokenSource,确保计时器从请求发起时开始计算:
[TestMethod] [DataRow(1)] [DataRow(10)] [DataRow(100)] [DataRow(1000)] [DataRow(10000)] [DataRow(100000)] [DataRow(1000000)] public void HttpClient_Send_CancellationTokenSource(int timeout) { using var httpClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://google.com"); Thread.Sleep(2 * timeout); // 关键:在调用Send前才创建超时令牌源 using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(timeout)); using var response = httpClient.Send(request, cancellationToken: cts.Token); }
补充说明
- 如果需要全局默认超时,可以直接设置
HttpClient.Timeout属性,它会作用于所有请求;而CancellationTokenSource的方式更灵活,能给每个请求单独配置不同超时。 - 用
using语句包裹HttpClient、CancellationTokenSource和HttpResponseMessage,避免资源泄漏。
内容的提问来源于stack exchange,提问作者mhd
相关产品推荐
相关产品推荐

