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

通过 CancellationToken 提高 Web 性能

时间:2022-12-15 09:44:48浏览次数:79  
标签:cancellationToken Web CancellationToken 性能 result 执行 方法

在 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 辅助注水浇筑而成,如有雷同,完全有可能。

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

相关文章

  • Minimizing Go WebAssembly Binary Size
    MinimizingGoWebAssemblyBinarySizehttps://dev.bitolog.com/minimizing-go-webassembly-binary-size/ PostedonOctober9,2020byOmriCohenEstimatedrea......
  • webpage页面打开速度变慢--Session阻塞造成时的解决方案(转)
    Asp.net项目因Session阻塞导致页面打开速度变慢    前年有个Asp.net项目上线后,正常情况下大部分页面打开速度都很快,但个别页面处理速度较慢。奇怪的是一旦访问个别......
  • webpack——The top-level-await experiment is not enabled (set experiments.topLev
    前言在搏皮中通过动态的引入CDN资源,来减少搏皮制品的大小,但是webpack没有开启topLevelAwait所以产生了报错;experiments:https://webpack.docschina.org/configuration/......
  • 创建一个WebApi项目
    原文链接:https://www.bilibili.com/video/BV12L4y1b7ND/?spm_id_from=333.337.search-card.all.click&vd_source=23aa9dcacf4c7ddaed4172b5ffd451ab创建一个WebApi大致分......
  • JAVA中生成随机数Random VS ThreadLocalRandom性能比较
    前言大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么......
  • javaweb7
    JQuery1.介绍1.1web前端知识点回顾HTML决定了网页的内容CSS决定了网页样式JavaScript决定了网页的功能标签属性,样式的操作DOM节点的操作异步交互的操作但是......
  • unix网络编程2.6——高并发服务器(七)基于epoll&&reactor实现web_socket服务器
    目录系列文章unix网络编程1.1——TCP协议详解(一)unix网络编程2.1——高并发服务器(一)基础——io与文件描述符、socket编程与单进程服务端客户端实现unix网络编程2.2——高并......
  • Vue的浏览器中的 webStorage
    Vue的浏览器中的 webStorage1:Api介绍/*webStorage存储内容大小一般支持5MB左右(不同浏览器可能还不一样)浏览器端通过Window.sessionStorage和Window.localStorage......
  • ASP.NET Core 奇淫技巧之动态WebApi
    一.前言接触到动态WebApi(DynamicWebAPI)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件来使......
  • [CTFSHOW1024]Web篇
    文章目录​​1024_WEB签到​​​​1024_图片代理​​​​1024_fastapi​​​​姿势一​​​​姿势二​​​​姿势很多,随便测试两个​​​​1024_柏拉图​​​​1024_hello_w......