我有一个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();
}
我认为await关键字为新的传入请求释放当前线程。
它确实;线程是免费的。但是,请求未完成。如果该请求在会话上具有读/写锁定,则在该锁定空闲之前,不能处理该会话的其他请求。
要解决此问题,您需要更改会话使用情况。如果你可以无会话,这是最好的 - 它允许非常好的水平可扩展性。如果没有,请尝试以只读方式进行操作。具有只读会话锁的长请求可以与同一会话中的其他请求同时运行,如果它们也只需要只读会话锁。