为什么在执行async / await方法之前阻止所有请求

问题描述 投票:0回答:1

我有一个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();
}
asp.net asynchronous model-view-controller async-await action
1个回答
1
投票

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

它确实;线程是免费的。但是,请求未完成。如果该请求在会话上具有读/写锁定,则在该锁定空闲之前,不能处理该会话的其他请求。

要解决此问题,您需要更改会话使用情况。如果你可以无会话,这是最好的 - 它允许非常好的水平可扩展性。如果没有,请尝试以只读方式进行操作。具有只读会话锁的长请求可以与同一会话中的其他请求同时运行,如果它们也只需要只读会话锁。

© www.soinside.com 2019 - 2024. All rights reserved.