如果一个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中的设计的更多相关文章

  1. C# ASP.NET Core使用HttpClient的同步和异步请求

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  2. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

    前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...

  3. asp.net core系列 47 Identity 自定义用户数据

    一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...

  4. ASP.NET Core奇遇记:无用户访问,CPU却一直100%

    这是5月11日遇到的一个问题,1台1核1G阿里云Linux服务器运行着生产环境中的ASP.NET Core站点,出现CPU 100%问题. 开始以为是这台服务器负载高引起的,于是将这台服务器从负载均衡 ...

  5. asp dotnet core 通过图片统计 csdn 用户访问

    在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...

  6. 使用ASP.NET Core开发信息采集系统将用户数据添加至企业微信

    一.启动Visual Studio 2019,创建ASP.NET Core Web应用程序 二.在Models文件夹添加新项 Person.cs using System.ComponentModel ...

  7. asp.net core 3.x 微信小程序登录库(也可用于abp)

    视频教程(使用+实现原理):https://share.weiyun.com/57HKopT 建议直接看视频 源码地址:https://github.com/bxjg1987/abpGeneralMo ...

  8. 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...

  9. Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)

    一.在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错. 服务器返回405,请求谓词无效. 二.问题 ...

  10. IE内核发送ajax请求时不会将url中的参数编码

    有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...

随机推荐

  1. markdown表格插入linux变量

    一.背景 看标题不难发现这是一个很"小众"的话题,其实本篇是对之前做的单元测试钉钉告警(此篇:https://www.cnblogs.com/ailiailan/p/1322203 ...

  2. 说说Java的类加载机制?究竟什么是双亲委派模型?

    首先引入一个概念,什么是Java类加载器? 一句话总结:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中. 官方总结:Java类加载器(英语:Java Classloa ...

  3. Hugging Face国内镜像站:告别Hugging Face模型下载难题

    Hugging Face国内镜像站: https://hf-mirror.com/

  4. FPGA开发中的复位问题

    一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...

  5. PowerShell 重命名文件夹及删除空文件夹

    数据来源 $urldata 中的倒数第2列(子文件夹名称列)包含 /.\ 等特殊字符 某个文件夹重命名脚本 foreach ($i in 0..100) { # 提取路径部分 $basePath = ...

  6. Codeforces Round 732 (Div

    AquaMoon and Strange Sort 有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\).每个人的朝向可以是朝左.朝右.一开始所有人的方向都是朝 ...

  7. 震惊!推荐一款AI驱动的自动化测试神器:TestCraft

    在当今快速迭代的软件开发环境中,自动化测试已经成为确保软件质量的重要一环.然而,传统的手动录制和编写测试脚本的方式不仅耗时耗力,还难以跟上敏捷开发的节奏. 本文将为大家介绍一款基于AI技术的自动化测试 ...

  8. Word转Pdf方式

    最近在工作中需要将word文件转换为pdf文件,找了很多种方式.以下简单列一下: 一.Aspose-words(推荐) 使用Aspose比较方便,转换之后格式这些基本没什么问题.我也使用的此种方式.正 ...

  9. ClickHouse 物化视图学习总结

    物化视图 物化视图源表--基础数据源 创建源表,因为我们的目标涉及报告聚合数据而不是单条记录,所以我们可以解析它,将信息传递给物化视图,并丢弃实际传入的数据.这符合我们的目标并节省了存储空间,因此我们 ...

  10. Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询

    以此案例举例: 使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按 ...