ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计

2021-04-03 20:30:45  阅读:311  来源: 互联网

标签:CancellationToken asp ICancellationTokenProvider 异步 HttpContext abp core net


如果一个Controller.Action里的处理非常耗时,比如读数据库、文件操作、调用第三方接口等
此时用户随时可能关闭浏览器、F5刷新网页等操作。
但是服务端的耗时代码任然在执行,这太浪费了,既然用户终止请求了,我们就应该取消所有的耗时操作

在.net开发中,几乎所有的异步方法都有个CancellationToken类型的参数,只要我们传入此令牌,将来我们随时可以通过此令牌取消异步操作
而asp.net中HttpContext提供了一个RequestAborted属性,它就是CancellationToken类型,当用户以任何方式终止请求时, HttpContext.RequestAborted就会触发取消
所以如果我们在异步方法中都传入这个参数,就能实现当用户终止请求时,我们所有的异步操作都会立即取消

并发大的情况下,这个操作很重要。

参考代码:

1 public async Task<ActionResult> TestAsync()
2 {
3         await System.IO.File.ReadAllTextAsync(@"d:\a.txt", HttpContext.RequestAborted);
4         //....略        

 

上面是asp.net默认行为,你会发现一个问题,真个应用程序有铺天盖地的异步方法,如果都想实现上述特征 我们所有的异步方法都得加上CancellationToken参数
abp提供了一种牛X的方式
它提供一个ICancellationTokenProvider接口,它会为我们提供一个CancellationToken对象,所以我们定义的异步方法不需要定义CancellationToken参数了,首先在我们的类中依赖注入这个接口,然后在调用.net内置库或第三方库的异步方法时,传入ICancellationTokenProvider.Token就可以了,如下:

1 ICancellationTokenProvider CancellationTokenProvider ;
2 
3 //构造函数注入CancellationTokenProvider 略...
4 
5 public override async Task<List<TEntity>> GetAllListAsync()
6 {
7             return await GetAll().ToListAsync(CancellationTokenProvider.Token);
8 }

比较推荐的是使用“空模式”,用属性注入,如下:

1 public ICancellationTokenProvider CancellationToken { get; set; } = NullCancellationTokenProvider.Instance;

abp中最终使用的是HttpContextCancellationTokenProvider,它的Token属性返回的就是HttpContext.RequestAborted


默认情况下abp的Repository中的所有异步方法已经使用这种模式,由于我们开发是大部分情况下都是数据库读写,所以我们在abp中几乎可以不关心这事,默认就是以合理的方式运行的。
但有时候我们需要做其它异步操作,比如调用第三方接口啥的,此时就需要通过上面的方式来实现这种 用户取消请求则所以异步操作理解取消的效果。

在某些场景中我们可能并不想用这种默认的行为,而是希望传入自己的CancellationToken对象,而不是用HttpContext的。这是我估计ICancellationTokenProvider.Use就派上用场了。怎么用呢?

标签:CancellationToken,asp,ICancellationTokenProvider,异步,HttpContext,abp,core,net
来源: https://blog.csdn.net/qq_45533926/article/details/115420180

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有