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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:39:52