CancellationToken 取消机制
1、背景
在我们访问一个十分耗时的请求的时候(这里以web请求举例)
如果请求执行到一半的时候,用户把页面关掉了,那后台还在执行请求就会造成资源的浪费,所以需要引入取消请求机制
2、举例
代码很简单,直接居个小例子
[HttpGet("GetFile")] public async Task<string> GetFile(string file) { CancellationTokenSource cts = new CancellationTokenSource();//通过CancellationTokenSource产生Token cts.CancelAfter(3000);//超时时间3s cts.Token.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件 return await DownFile(file, cts.Token); } private async Task<string> DownFile(string file, CancellationToken cancellationToken) { for (int i = 1; i <= 10; i++) { Console.WriteLine($"执行进度{i}"); if (cancellationToken.IsCancellationRequested) { return "超时"; } await Task.Delay(1000); } return file + ":下载完成"; }
执行结果:请求在3s的时候取消掉了
3、那怎么监听页面情况呢?
在action注入CancellationToken(net core),框架会自己监听页面情况,如:
[HttpGet("GetFile2")] public async Task<string> GetFile(string file, CancellationToken cancellationToke) { cancellationToke.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件 return await DownFile(file, cancellationToke); }
关闭跳转Web/Postman取消等,都是断开了http请求建立的链接,断开后即触发CancellationToken