AsyncTimeout动作过滤器有什么意义?

时间:2017-09-05 17:27:38

标签: c# asp.net-mvc asp.net-mvc-5 async-await

尝试减少控制器给定操作的超时(假设它是索引)我用AsyncTimeout(5000)注释了它。
在该方法中,第一行是await Task.Delay(10000) 我将该代码发布到azure,保证没有debug="true",但即便如此,请求也会持续11-13秒...所以,在我看来,这不是应该如何使用...

那么,我应该在哪里使用这个属性?

详细说明:
使用.net 4.7(编译和运行时)和后期asp.net mvc(5.2.3)

1 个答案:

答案 0 :(得分:4)

您应该使用接受CancellationToken的Task.Delay的重载。在这种情况下,AsyncTimeout将触发取消。您发布的代码未使用CancellationToken,因此如果没有它,我不会发生任何不同的事情。

更新 - 快速演示基于您的问题。这应该在大约5秒内抛出TaskCanceledException,而不是等待15秒的Task.Delay调用。

[AsyncTimeout(5000)]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
    Stopwatch cancellationTimer = Stopwatch.StartNew();
    try
    {                
        await Task.Delay(15000, cancellationToken);
        cancellationTimer.Stop();
        return View();
    }
    catch (Exception e)
    {
         cancellationTimer.Stop();
         Debug.WriteLine($"Elapsed Time {cancellationTimer.ElapsedMilliseconds}");
         throw (e);
    }            
}