通过 CancellationToken 提高 Web 性能
在 Web 开发中,经常会遇到这样的场景:用户发起一个请求,Web 服务器执行一些计算密集型的操作,等待结果返回给用户。这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器端依然会继续执行计算,这样就会造成资源浪费。
为了解决这个问题,我们可以使用 CancellationToken 来提高 Web 性能。CancellationToken 是 .NET 中一个很重要的概念,它可以用于在代码执行过程中取消操作。
下面,我们将通过一个示例来演示如何使用 CancellationToken 来提高 Web 性能。
代码示例
下面是一段使用 CancellationToken 的代码:
public async Task<int> DoWorkAsync(CancellationToken cancellationToken)
{
var result = 0;
for (int i = 0; i < 10000; i++)
{
// 检查是否已经取消操作
cancellationToken.ThrowIfCancellationRequested(); result += i;
} return result;
}
上面的代码定义了一个 DoWorkAsync 方法,该方法用于执行一个计算密集型的任务。在方法内部,我们使用了 CancellationToken 的 ThrowIfCancellationRequested 方法来检查是否已经取消了操作。如果取消了操作,那么方法会抛出一个 OperationCanceledException 异常,并终止执行。
这样,我们就可以在 Web 服务器端执行计算密集型的任务时,在用户取消请求时及时停止执行,避免浪费资源。
使用建议
在实际开发中,我们可以将 CancellationToken 作为一个参数,传递给执行计算密集型任务的方法。例如,在 ASP.NET Core 中,我们可以在控制器的 Action 方法中加入一个 CancellationToken 参数,然后在执行计算任务时传递这个参数。
[HttpGet]
public async Task<IActionResult> GetData(CancellationToken cancellationToken)
{
var result = await GetDataAsync(cancellationToken);
return Ok(result);
}
下面是一段演示了 cancellationToken 在 service 层和数据库访问层的使用方式的代码:
// service 层
public async Task<int> GetDataAsync(CancellationToken cancellationToken)
{
// 执行计算密集型的任务
var result = await DoWorkAsync(cancellationToken); // 访问数据库
using (var dbContext = new DbContext())
{
return await dbContext.SaveChangesAsync(cancellationToken);
}
}
上面的代码定义了一个 service 层的 GetDataAsync 方法,该方法用于从数据库中获取数据。在方法中,我们首先执行了一个计算密集型的任务,然后使用了 DbContext 的 CountAsync 方法来从数据库中获取数据。
在使用 cancellationToken 的过程中,我们首先在 GetDataAsync 方法的参数列表中加入了一个 CancellationToken 类型的参数。这样,我们就可以在调用该方法时传入一个 cancellationToken 参数,并在方法中使用它来检查是否取消了操作。
在方法中,我们首先执行了一个计算密集型的任务,并将 cancellationToken 作为参数传递给了 DoWorkAsync 方法。如果在执行过程中用户取消了操作,那么 DoWorkAsync 方法会抛出一个 OperationCanceledException 异常,并终止执行。
然后,我们使用 DbContext 的 SaveChangesAsync 方法来从数据库中获取数据。在调用 SaveChangesAsync 方法时,我们也将 cancellationToken 作为参数传递进去。如果用户取消了操作,那么 SaveChangesAsync 方法也会抛出一个 OperationCanceledException 异常,并停止执行。
总结
通过使用 CancellationToken,我们可以在用户取消请求时,及时停止执行的任务,避免浪费资源。
参考资料
本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能。
- 本文作者: newbe36524
- 本文链接: https://www.newbe.pro/ChatAI/Performance-enhancement-for-web-by-cancellation-token/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
通过 CancellationToken 提高 Web 性能的更多相关文章
- 提高Web性能的前端优化技巧总结
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- [转] 《高性能HTML5》读后整理的Web性能优化内容
读后感 先说说<高性能HTML5>这本书的读后感吧,个人觉得这本书前两章跟书的标题完全搭不上关系,或者说只能算是讲解了“高性能”这三个字,HTML5完全不见踪影.个人觉得作者应该首先把HT ...
- Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能
Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数 当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存, ...
- 提高 web 应用性能之 CSS 性能调优
简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...
- [转]提高 web 应用性能之 CSS 性能调优
简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...
- 如何提高Web应用系统的性能?
随着互联网信息技术的发展,人们逐渐开始习惯在网络上交友.购物.学习.娱乐.工作,甚至是找工作.因此市场对网站的响应速度也提出了新的要求,提高Web应用系统的性能成为急需解决的关键问题.本文将会给出一些 ...
- [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...
- 用CSS开启硬件加速来提高网站性能
国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/rubylouvre/p/3471490.html 原文地址:http://blog.teamt ...
- 转载--提高C++性能的编程技术
读书笔记:提高C++性能的编程技术 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...
随机推荐
- python 代码执行顺序
Python代码在执行过程中,遵循下面的基本原则: 普通语句,直接执行: 碰到函数,将函数体载入内存,并不直接执行 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行 碰到if.for等控制语句 ...
- Python中class内置方法__init__与__new__作用与区别探究
背景 最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new__,决定先尝试 ...
- 工业互联网领域的企业,都已经接入了ERP或者MES系统了吗?
肯定不是得啊!之前的两化,后来的企业上云,到当下的智能制造.数字化转型,不都是想把制造业(也就是你说的工业互联网企业)往这个方向推么,ERP和MES是企业数字化的一部分,但不是全部,当然有的企业(小工 ...
- Qemu/Limbo/KVM镜像 Ubuntu 22.04 精简版,可运行Windows软件,内存占用不到200M
镜像特征: Ubuntu 22.04系统 内置Wine 7.8,可运行大量Windows 软件 高度精简,内存占用仅200M不到. 自制UI,Windows3.1风格. 完全开源 镜像说明: 用户名为 ...
- docker搭建个人云盘可道云kodbox
1.拉取kodbox镜像 (文章最后有自己编写yml文件可直接搭建) docker pull tznb/kodbox:1.15 2. 创建并启动kodbox docker run -d -it --n ...
- Docker | Compose创建mysql容器
本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ...
- 16.MongoDB系列之分片管理
1. 查看当前状态 1.1 查看配置信息 mongos> use config // 查看分片 mongos> db.shards.find() { "_id" : & ...
- 前端框架Vue------>第一天学习、Vue学习的路径、Vue官网(1)
文章目录 1.学习目标 2.前端知识体系 2.1 前端三要素 2.2.MVVM 3.第一个Vue程序 4.Vue实例的生命周期 vue的官方文档:https://cn.vuejs.org/ 1.学习目 ...
- 一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.简述Redis事务实现 2.redis集群方案 3.redis主从复制的核心原理 4.CAP理论,BASE理论 5.负 ...
- python基础之标识符、注释与变量
一.注释 1.作用:注释是用来解释和说明代码的. 2.分类:注释可以分为单行注释和多行注释 2.1.单行注释:在编写的代码或文字前加上"#",表示单行注释 1 #我是单行注释 2 ...