通过 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对象会带来一定的开销,因此在默认情况 ...
随机推荐
- Node.js躬行记(23)——Worker threads
Node.js 官方提供了 Cluster 和 Child process 创建子进程,通过 Worker threads 模块创建子线程.但前者无法共享内存,通信必须使用 JSON 格式,有一定的局 ...
- Ubuntu转到root用户后用户名路径没有颜色
看到好多都直接把普通会用户的.bashrc配置复制到root家目录下,由于本人小白,很多.bashrc配置看不懂,也不敢随便修改.于是找到别的配置方法. 普通用户的os@a:~$和root用户的roo ...
- C++ 右值引用与 const 关键字
C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的.使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能. ...
- 6.MongoDB系列之特殊索引和集合类型
1. 地理空间索引及全文搜索 与Elasitcsearch一样,MongoDB同样支持地理空间索引及全文搜索,由于选型常用ES而非MongoDB此处略过 2. TTL索引 首先先了解下固定集合,其类似 ...
- 提高工作效率的神器:基于前端表格实现Chrome Excel扩展插件
Chrome插件,官方名称extensions(扩展程序):为了方便理解,以下都称为插件. 我们开发的插件需要在浏览器里面运行,打开浏览器,通过右上角的三个点(自定义及控制)-更多工具-拓展程序-打开 ...
- 5.httprunner-hook机制
hook简介 httprunner3是基于python的pytest框架,里面也有前置和后置的概念 setup_hooks:开始执行前触发hook函数,主要用于请求预处理(签名,加密等) teardo ...
- C#中的特性+反射
反射 反射指程序可以访问.检测和修改它本身状态或行为的一种能力. 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象. 您可以使用反射动态地创建类型的实例,将类型 ...
- ubuntu+Django + nginx + uwsgi 部署
ubuntu+Django + nginx + uwsgi 部署 0.前期准备 注意:以下几件事都必须在激活虚拟环境下完成 运行以下命令生成项目所需的依赖列表,会在项目根目录生成一个requireme ...
- 【题解】CF356A Knight Tournament
题面传送门 本蒟蒻想练习一下并查集,所以是找并查集标签来这里的.写题解加深理解. 解决思路 自然,看到区间修改之类很容易想到线段树,但本蒟蒻线段树会写挂,所以这里就讲比较简单的并查集思路. 并查集的核 ...
- 2022-11-03 Acwing每日一题
本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...