Может ли код после 'await' выполняться в другом потоке в ASP. NET? - PullRequest
2 голосов
/ 04 февраля 2020

Я прочитал здесь https://blog.stephencleary.com/2009/10/synchronizationcontext-properties.html, что ASP. NET контекст выполнения приложений не имеет определенной c связанной нити. Означает ли это, что код после await будет (может) выполняться в другом потоке с одинаковым контекстом? В таком случае, как возможно, что тупик может быть вызван синхронным выполнением? Или ASP. NET приложение не подходит для такого тупика?

Заранее спасибо.

1 Ответ

3 голосов
/ 04 февраля 2020

Для ASP. NET Classi c (. NET Framework) существует специальная AspNetSynchronizationContext, продолжение будет отправлено обратно в исходный контекстный поток.

ASP. NET Ядро нет ни одного. Если вы проверите SynchronizationContext.Current, вы обнаружите, что он установлен на null. Таким образом, продолжение может свободно использовать любой выбранный им поток и не будет иметь классических c взаимных блокировок в этом отношении


Обновление

Некоторые большие исправления из @ StephenCleary в комментариях

Незначительная коррекция: on classi c ASP. NET, SynchronizationContext представляет контекст запроса , а не спецификация c thread .

Метод может возобновиться в любом потоке пула потоков после await. Тупик возникает из-за наличия блокировки как части этого контекста запроса , чтобы гарантировать, что только один поток за раз может находиться в контексте запроса .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...