50

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

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

但其他示例甚至 VS2013 的默认 ASP.NET 项目根本不使用 CancellationToken 并且没有它也可以工作:

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

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

4

3 回答 3

52

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

于 2013-09-25T17:42:46.843 回答
7

你可以用这个

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);
    }
}

取自这里

于 2016-12-13T05:12:23.497 回答
3

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

您可以通过将 CancellationToken 注入到您的操作方法中来做到这一点,该方法将自动绑定到请求的 HttpContext.RequestAborted 令牌。您可以像往常一样检查此令牌是否取消,并将其传递给任何支持它的异步方法。如果请求被取消,将抛出 OperationCanceledException 或 TaskCanceledException。

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

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

于 2018-07-11T12:10:35.383 回答