通过 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对象会带来一定的开销,因此在默认情况 ...
随机推荐
- Beats:使用 Elastic Stack 记录 Python 应用日志
文章转载自:https://elasticstack.blog.csdn.net/article/details/112259500 日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技 ...
- 【前端必会】让ESLint与Prettier一起玩耍
背景 上回说到ESlint和Prettier可能会有规则上的冲突,解决的办法有多种,好比不用Prettier 不用Prettier也是一种选择 配置相同的规则 我们选择一种可以共存的方式 可以参考这篇 ...
- vue3 自定义指令控制按钮权限
经过1个周的摸索和查阅资料,终于搞定VUE3中自定义指令,实现按钮级别的权限控制.当然,只是简单的对按钮进行隐藏和删除的dom操作比较容易,一直纠结的是当按钮无权限时,不是直接删除当前dom元素(bu ...
- HBase(1/5)
HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...
- P7800 [COCI2015-2016#6] PAROVI 方法记录
原题链接 桔梗花于此开放 [COCI2015-2016#6] PAROVI 题目描述 \(\text{Mirko}\) 和 \(\text{Slavko}\) 在玩一个游戏,先由 \(\text{Mi ...
- ExceptionHandler配合RestControllerAdvice全局处理异常
Java全局处理异常 引言 对于controller中的代码,为了保证其稳定性,我们总会对每一个controller中的代码进行try-catch,但是由于接口太多,try-catch会显得太冗杂,s ...
- day48-JDBC和连接池04-2
JDBC和连接池04-2 10.数据库连接池 10.5Apache-DBUtils 10.5.1resultSet问题 先分析一个问题 在之前的程序中,执行sql语句后返回的结果集存在如下问题: 关闭 ...
- 9.MongoDB系列之创建副本集(二)
1. 如何设计副本集 大多数:选取主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时就是安全的写操作.这里的大多数定义为"副本集中一半以上的 ...
- 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串
[算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...
- jmeter接口自动化-通过csv文件读取用例并执行测试
最近在公司测试中经常使用jmeter这个工具进行接口自动化,简单记录下~ 一.在csv文件中编写好用例 首先在csv文件首行填写相关参数(可根据具体情况而定)并编写测试用例.脚本可通过优先级参数控制执 ...