Почему все мои запросы блокируются, пока не будет выполнен метод async / await - PullRequest
0 голосов
/ 20 марта 2019

У меня есть asp.net mvc async метод, ожидающий 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 Ответ

1 голос
/ 23 марта 2019

Я подумал, что ключевое слово await освобождает текущий поток для нового входящего запроса.

Это делает;нить свободна.Однако запрос не завершен.И если этот запрос имеет блокировку чтения / записи в сеансе, то никакие другие запросы для этого сеанса не могут быть обработаны, пока эта блокировка не освободится.

Чтобы решить эту проблему, вам необходимо изменить использование сеанса.Если вы можете работать без сессии, это лучше всего - это обеспечивает действительно хорошую горизонтальную масштабируемость.Если нет, попробуйте перейти только для чтения.Длинные запросы с блокировкой сеанса только для чтения могут выполняться одновременно с другими запросами в том же сеансе, если им также требуется только блокировка сеанса только для чтения.

...