asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计
如果一个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就派上用场了。怎么用呢?
asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计的更多相关文章
- C# ASP.NET Core使用HttpClient的同步和异步请求
引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...
- asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...
- asp.net core系列 47 Identity 自定义用户数据
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
- ASP.NET Core奇遇记:无用户访问,CPU却一直100%
这是5月11日遇到的一个问题,1台1核1G阿里云Linux服务器运行着生产环境中的ASP.NET Core站点,出现CPU 100%问题. 开始以为是这台服务器负载高引起的,于是将这台服务器从负载均衡 ...
- asp dotnet core 通过图片统计 csdn 用户访问
在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...
- 使用ASP.NET Core开发信息采集系统将用户数据添加至企业微信
一.启动Visual Studio 2019,创建ASP.NET Core Web应用程序 二.在Models文件夹添加新项 Person.cs using System.ComponentModel ...
- asp.net core 3.x 微信小程序登录库(也可用于abp)
视频教程(使用+实现原理):https://share.weiyun.com/57HKopT 建议直接看视频 源码地址:https://github.com/bxjg1987/abpGeneralMo ...
- 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计
配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...
- Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)
一.在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错. 服务器返回405,请求谓词无效. 二.问题 ...
- IE内核发送ajax请求时不会将url中的参数编码
有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...
随机推荐
- ClearCLIP:倒反天罡,删除两个组件反而可以提升密集预测性能 | ECCV'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: ClearCLIP: Decomposing CLIP Representations for Dense Vision-Language I ...
- [Windows] 屏幕截图工具Snipaste 开发过程更轻松
前言 老大:你去把用户登录代码写完. 老大:你把这周的周报发一下 老大:你把生产的数据清理一下. 结果.... 今天刚把登录代码写完,下班,明天就处理别的事情去了!!! 之后我就... 直接F1 截屏 ...
- 本文是第一篇在GitHub仓库中撰写的.md格式的blog文件
正文内容: 具体内容,只是未来测试,给出福利: 模板格式: title: 博文标题 description: 博文摘要 #多个标签请使用英文逗号分隔或使用数组语法 tags: 标签1, 标签2 #多个 ...
- K8s之运行时containerd安装和使用
一.containerd 1. 前生今世 很久以前,Docker 强势崛起,以"镜像"这个大招席卷全球,对其他容器技术进行致命的降维打击,使其毫无招架之力,就连 Google 也不 ...
- 4G模组PSM+超低功耗,手把手教你!
合宙4G-Cat.1模组支持三种功耗模式: 常规模式 低功耗模式 PSM+模式 用户可以根据不同的应用场景,按需选择不同的合宙4G-Cat.1模组功耗模式,以及三种功耗模式之间的相互转换. 合宙 ...
- vue3-Pinia
Pinia 是 Vue.js 的一个状态管理库,用于在 Vue 应用程序中管理共享状态.它是 Vuex 的后继者,提供了一个简单.直观且灵活的方式来处理应用中的全局状态,比如用户登录信息.应用配置.购 ...
- 题解:AT_abc382_c [ABC382C] Kaiten Sushi
题目传送门 思路 首先看一下数据范围. \(1 \leq N, M \leq 2 \times 10^5\) \(1 \leq A_i, B_i \leq 2 \times 10^5\) 这么大的数据 ...
- Astro Zen Blog |一个优雅、极简、强大的博客
介绍 Astro Zen 博客项目 如果你想部署一个自己的静态博客,又不想到处折腾,并且是熟悉的前端技术栈,你可以尝试下:Astro Zen Blog! Astro Zen Blog 是一个使用 As ...
- Linx操作Nginx命令
在 CentOS 上操作 Nginx 包括安装.启动.停止.重新加载配置等.以下是在 CentOS 上操作 Nginx 的常用命令: 安装 Nginx: sudo yum install nginx ...
- node-sass安装问题
前情 最近在开发一个小程序项目,为了开发速度,部分页面使用原有H5,但原有H5需要对小程序做一定兼容适配,发现原有H5项目是个很古老项目. 坑位 在项目启动前,需要执行npm install安装项目依 ...