Вопрос о многопоточности ASP.NET — как работают заблокированные потоки?

Есть приложение asp.net mvc (не core), хостится в ажуре. Имеется одно единственное ядро.

Как я представляю себе логику работы:
На каждый входящий запрос создаётся поток. Внутри потока может быть асинхронность (а может и не быть). Каждый поток получает квант времени и все потоки работают по очереди, пока не выполнятся.

Вопрос следующий: если у нас в одном потоке возникает блокирующая операция (например, мы синхронно полезли в базу), то как этот поток будет влиять на работу других потоков?
Будет ли он получать свои кванты времени, такие же как у других потоков?
Если да (будет получать столько) - то поможет ли запуск обращений в базу через async/await?
Если нет - то зачем вообще async/await, если поток и без них останавливается?
Или я в каком то месте в корне заблуждаюсь?
  • Вопрос задан
  • 567 просмотров
Решения вопроса 1
ASP.NET MVC and Web API - Comparison of Async / Sy...

Есть пул потоков.
Пришел запрос - достали поток из пула, и он начал обрабатывать запрос.

Если поток встретил await (запрос в БД например, не CPU bound операция) и результат не доступен (может быть доступен сразу), то он ушел обратно в пул. Когда await получит результат, то из пула достанут поток и передадут ему результат и он продолжит выполнение.

Если поток встретит запрос в БД, но не будет await, то он останется ждать результата, в пул не вернется, не сможет обслуживать другие запросы, просто будет ждать.

Пример из жизни:
Заказали пиццу по телефону.
- синхронно - идем к двери и ждем звонка от курьера.
- асинхронно - занимается другими делами, когда курьер доставит пиццу он позвонит в дверь и мы подойдем за ней.

Асинхронность != многопоточность, это ее часть.
What is the difference between asynchronous progra...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы