无取消时限的CancellationTokenSource绑定HTTP请求是否永不过期?
关于CancellationTokenSource与HTTP请求过期的问题
背景说明
System.Threading.CancellationTokenSource支持两种实例化方式,对应的构造函数如下:
public CancellationTokenSource(); public CancellationTokenSource(int millisecondsDelay);
将其绑定到HTTP请求的示例代码:
await httpClient.SendRequestAsync(request).AsTask(CreateCancellationTokenSource().Token);
已知带取消周期的CancellationTokenSource会在时限到达后自动取消请求,现需明确:若使用不带取消周期的构造函数实例化,当响应迟迟未返回时,请求是否永远不会过期?
回答
是的,这种情况下请求不会自动过期。
不带取消周期的CancellationTokenSource不会主动触发取消操作,只有在以下几种场景下才会取消绑定的请求:
- 手动调用该
CancellationTokenSource的Cancel()或CancelAfter()方法; - 该
CancellationTokenSource对象被垃圾回收(但依赖垃圾回收触发取消不可靠,不建议依赖此方式)。
如果HTTP请求绑定了这种无自动取消逻辑的CancellationToken,只要服务器一直不返回响应、客户端网络未断开、进程未终止,请求就会一直处于挂起状态,持续占用客户端的网络资源和线程资源。
实际开发中不建议这么使用,最好通过以下方式避免请求无限挂起:
- 使用带超时参数的
CancellationTokenSource构造函数; - 手动在合适的业务时机调用
Cancel()方法; - 配置
HttpClient自身的Timeout属性(这是更推荐的HTTP请求超时控制方式,它针对整个请求生命周期做超时限制)。
内容的提问来源于stack exchange,提问作者SurenSaluka
相关产品推荐
相关产品推荐

