Для 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 метод готов к возобновлению, поток пула потоков берется, который входит в контекст запроса и пытается взять этот замок . Если в контексте этой задачи заблокирован другой поток, блокировка уже снята и возникнет взаимоблокировка