我们是否应该将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(以及为什么)。
你应该使用它。现在它仅适用于您有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);
}
}
取自这里。