通过 CancellationToken 提高 Web 性能

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

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

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

代码示例

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

public async Task<intDoWorkAsync(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<intGetDataAsync(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
  • DbContext.SaveChangesAsync

本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能。


原文始发于微信公众号(newbe技术专栏):通过 CancellationToken 提高 Web 性能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68079.html

(0)
newbe的头像newbebm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!