为了减少 Controller 的给定操作(例如,它的索引)的超时时间,我用AsyncTimeout(5000)对其进行了注释。
在该方法内部,第一行是await Task.Delay(10000)
我公开发布了该代码,以确保没有debug="true",但即使这样,请求的运行时间为11-13秒...所以,我认为这不是应该如何使用的...

所以,我应该在哪里使用该属性?

细节:
使用.net 4.7(编译和运行时)和最新版本的asp.net mvc(5.2.3)

最佳答案

您应该考虑使用Task.Delay的重载,该重载接受CancellationToken。在这种情况下,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);
    }
}

关于c# - AsyncTimeout操作筛选器的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46060404/

10-12 05:28