我们是否应该将CancelToken与MVC / Web API控制器一起使用

本文关键字:API Web 控制器 一起 MVC 是否 CancelToken 我们 | 更新日期: 2023-09-27 18:32:44

异步控制器有不同的例子。其中一些在方法定义中使用CancelToken:

public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken)
{
    await Database.GetItem(id, cancellationToken);
    ...

但是其他例子,甚至是VS2013的默认 ASP.NET 项目根本不使用CancelToken,没有它就可以工作:

public async Task<ActionResult> ShowItem(int id)
{
    await Database.GetItem(id);
    ...

目前尚不清楚我们是否应该在控制器中使用CancelToken(以及为什么)。

我们是否应该将CancelToken与MVC / Web API控制器一起使用

你应该使用它。现在它仅适用于您有AsyncTimeout,但未来的 MVC/WebAPI 版本很可能会将令牌解释为"超时客户端断开连接"。

用户可以随时通过点击浏览器上的停止或重新加载按钮来取消对 Web 应用的请求。通常,你的应用无论如何都会继续生成响应,即使 Kestrel 不会将其发送给用户。如果您有一个长时间运行的操作方法,则可能需要检测请求何时被取消,并停止执行。

您可以通过将 CancelToken 注入到操作方法中来执行此操作,该方法将自动绑定到请求的 HttpContext.RequestAborted 令牌。您可以像往常一样检查此令牌是否取消,并将其传递给支持它的任何异步方法。如果请求被取消,将引发操作已取消异常或任务已取消异常。

下面的链接详细解释了这种情况。

https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/

你可以使用这个

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
    using (var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken))
    {
        IEnumerable<ReportItem> items;
        using (ApplicationDbContext context = new ApplicationDbContext())
        {
            items = await context.ReportItems.ToArrayAsync(source.Token);
        }
        return View(items);
    }
}

取自这里。