Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们应该在MVC/Web API控制器中使用CancellationToken吗?_C#_Asp.net Mvc_Asp.net Web Api_Async Await_Cancellation Token - Fatal编程技术网

C# 我们应该在MVC/Web API控制器中使用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

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

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请求如何?