为什么我的所有请求都被阻止,直到执行了异步/等待方法

时间:2019-03-20 10:28:11

标签: asp.net asynchronous model-view-controller async-await action

我有一个asp.net mvc异步方法,等待10秒。 问题是IIS Express(也生产IIS)停止处理传入的请求,直到该异步方法完成为止。 我以为await关键字可以为新的传入请求释放当前线程。但似乎我错过了一些东西。

public async Task<ActionResult> AsyncMethod()
{
    using (DeliveryPortalEntities context = new DeliveryPortalEntities())
    {
        await context.Database.ExecuteSqlCommandAsync("WAITFOR DELAY '00:00:10'");
    }
    return Json(new { status = "ok" });
}

更新!谁能解释为什么在此代码执行期间IIS立即停止回答请求。

public async Task<ActionResult> AsyncMethod()
{
    await Task.Delay(10000).ConfigureAwait(false);
    return new EmptyResult();
}

1 个答案:

答案 0 :(得分:1)

  

我认为await关键字可以为新的传入请求释放当前线程。

确实如此;线程是免费的。但是,请求未完成。而且,如果该请求在会话上具有读/写锁,那么在释放该锁之前,无法处理该会话的其他请求。

要解决此问题,您需要更改会话使用情况。如果您可以无会话,那是最好的-它提供了非常好的水平可伸缩性。如果不是,请尝试设为只读。如果长请求具有只读会话锁,则它们也只需一个只读会话锁即可与其他请求在同一会话中同时运行。