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

 

posted @ 2023-05-01 11:32  wskxy  阅读(130)  评论(0编辑  收藏  举报