C# 我们应该在MVC/Web API控制器中使用CancellationToken吗?
异步控制器有不同的示例。其中一些在方法定义中使用CancellationToken:C# 我们应该在MVC/Web API控制器中使用CancellationToken吗?,c#,asp.net-mvc,asp.net-web-api,async-await,cancellation-token,C#,Asp.net Mvc,Asp.net Web Api,Async Await,Cancellation Token,异步控制器有不同的示例。其中一些在方法定义中使用CancellationToken: public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken) { await Database.GetItem(id, cancellationToken); ... public异步任务ShowItem(int-id,CancellationToken-Cancellat
public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken)
{
await Database.GetItem(id, cancellationToken);
...
public异步任务ShowItem(int-id,CancellationToken-CancellationToken)
{
wait Database.GetItem(id,cancellationToken);
...
但其他示例,甚至VS2013的默认ASP.NET项目,根本不使用CancellationToken,没有它也可以工作:
public async Task<ActionResult> ShowItem(int id)
{
await Database.GetItem(id);
...
公共异步任务ShowItem(int-id)
{
wait Database.GetItem(id);
...
目前还不清楚我们是否应该在控制器中使用CancellationToken(以及原因)。您应该使用它。目前它只适用,但未来的MVC/WebAPI版本可能会将该令牌解释为“超时或客户端断开连接”。您可以使用它
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);
}
}
公共异步任务。用户可以通过点击浏览器上的“停止”或“重新加载”按钮,随时取消对您的web应用程序的请求。通常,您的应用程序仍将继续生成响应,即使Kestrel不会将其发送给用户。如果您有一个长时间运行的操作方法,则您可能希望检测何时取消请求d、 停止执行
您可以通过将CancellationToken注入到操作方法中来完成此操作,操作方法将自动绑定到请求的HttpContext.RequestAborted令牌。您可以像往常一样检查此令牌的取消情况,并将其传递给支持它的任何异步方法。如果请求被取消,则会出现OperationCanceledException或TaskCancel将抛出eException
下面的链接详细解释了这个场景
Web API在取消令牌和断开连接的客户端方面的情况是否发生了变化?@DrewNoakes:AFAIK它还没有改变。我相信这将在ASP.NET vNext中得到解决。我刚刚在VS 2015下对其进行了测试,在浏览器中点击停止按钮确实触发了取消令牌。您如何将取消令牌从C#Web客户端传递到客户端一个get API方法?如何将取消令牌序列化为URL字符串?@ EES:我根本不尝试。相反,考虑在取消令牌被触发时让客户端关闭它的连接,并让服务器取一个取消令牌作为参数。(由WebAPI自动提供,并在连接断开时取消)。您必须处理LinkedTokenSource,因为它永远不会被GC收集,并且会导致内存泄漏。MSDN:请注意,处理完链接的令牌源后,您必须对其调用dispose。根据参考,此过程是使取消令牌与MVC 5一起工作所必需的;“…出于某种原因,MVC 5仅在使用AsyncTimeout属性时才支持取消。”。文章指出,“在ASP.NET Core MVC和Web API中,一切都按预期运行…”。也就是说,如果您使用的是.NET Core,那么您只需像正常情况一样传递CancellationToken。在SPA中,ajax请求如何?