首页 > 其他分享 >通过 CancellationToken 提高 Web 性能

通过 CancellationToken 提高 Web 性能

时间:2022-12-15 23:12:10浏览次数:50  
标签:cancellationToken Web CancellationToken 性能 result 执行 方法

https://www.cnblogs.com/newbe36524/p/16975042.html

 

在 Web 开发中,经常会遇到这样的场景:用户发起一个请求,Web 服务器执行一些计算密集型的操作,等待结果返回给用户。这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器端依然会继续执行计算,这样就会造成资源浪费。

为了解决这个问题,我们可以使用 CancellationToken 来提高 Web 性能。CancellationToken 是 .NET 中一个很重要的概念,它可以用于在代码执行过程中取消操作。

下面,我们将通过一个示例来演示如何使用 CancellationToken 来提高 Web 性能。

代码示例

下面是一段使用 CancellationToken 的代码:

 
1 2 3 4 5 6 7 8 9 10 11 12 13 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 参数,然后在执行计算任务时传递这个参数。

 
1 2 3 4 5 6 [HttpGet] public async Task<IActionResult> GetData(CancellationToken cancellationToken) {     var result = await GetDataAsync(cancellationToken);     return Ok(result); }

  

下面是一段演示了 cancellationToken 在 service 层和数据库访问层的使用方式的代码:

 
1 2 3 4 5 6 7 8 9 10 11 12 // 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,我们可以在用户取消请求时,及时停止执行的任务,避免浪费资源。

标签:cancellationToken,Web,CancellationToken,性能,result,执行,方法
From: https://www.cnblogs.com/chinasoft/p/16986205.html

相关文章

  • 破记录!国产数据库KunDB 单节点TPC-C事务性能超180万tpmC
    近日,星环科技KunDB在TPC-C事务性能测试中,采用常规国产服务器,实现了单节点tpmC超180万,体现其世界级领先的事务处理能力。TPC-C是全球OLTP数据库最权威的性能测试基准,由TP......
  • Dubbo性能调优参数
    dubbo参数说明:https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/properties/调优参考:https://blog.csdn.net/yudianxiaoxiao/article/details/123......
  • MySQL查询性能优化七种武器之索引下推
    ​​MySQL查询性能优化七种武器之索引潜水​​​​MySQL查询性能优化七种武器之链路追踪​​今天要讲的是MySQL的另一种查询性能优化方式— 索引下推(IndexConditionPush......
  • 软件测试之Web测试如何进行?广东好口碑软件测评公司推荐
    无论是PC端还是移动端,我们日常生活、工作和学习所需要的各种应用程序都可以以Web的形式存在于各种浏览器中。Web应用程序也成为了企事业单位对外宣传、开展业务的重要渠......
  • docker registry(私库)搭建,使用,WEB可视化管理部署
    DockerRegistry是Docker官方一个镜像,可以用来储存和分发Docker镜像。目前比较流行的两个镜像私库是DockerRegistry,HarBor其中HarBor最合适企业级应用,提供良好的WEB界......
  • webuploader web 大文件上传源代码
    ​PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间......
  • WebApi Autofac依赖注入配置
    publicclassAutofacConfig{///<summary>///IOC注册///</summary>publicstaticvoidRegister(){......
  • 实验八 Web配置实验报告 20221418
    实验过程1.购买云服务器2.下载php,编辑myphp3.在wordpress里面实现自己的编写遇到的问题在mysql-uroot-p一步时输入自己的密码但始终显示错误,后来随便输了另一个......
  • springmvc web 大文件上传源代码
    ​ 最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的......
  • 简单创建webservice接口并采用rpc方式调用
    简单创建webservice接口并采用rpc方式调用一、简单创建webservice接口1.新建一个maven项目2.创建一个包3.创建一个接口在新建的包下创建接口点击查看代码public......