Для ASP.NET Classic (.NET Framework) существует специальный AspNetSynchronizationContext
, продолжение будет отправлено обратно в исходный поток контекста.
ASP.NET Core нет. Если вы проверите SynchronizationContext.Current
, вы обнаружите, что он установлен на null
. Таким образом, продолжение может использовать любой поток, который он выберет, и не будет иметь классических взаимоблокировок в этом отношении.
Обновить
Некоторые отличные исправления от @StephenCleary в комментариях.
Незначительное исправление: в классическом ASP.NET SynchronizationContext
представляет контекст запроса, а не конкретный поток.
метод может возобновиться в любом потоке пула потоков после await
. Тупиковая ситуация возникает из-за наличия блокировки как части этого контекста запроса, чтобы гарантировать, что только один поток одновременно может находиться в контексте запроса .
Итак, когда асинхронный метод готов к возобновлению, берется поток пула потоков, который входит в контекст запроса и пытается принять этот заблокировать. Если другой поток заблокирован для этой задачи в контексте, блокировка уже взята, и произойдет взаимоблокировка.
person
TheGeneral
schedule
03.02.2020
lock
обходить большинство переменных. Исключение составляют случаи, когда вы изо всех сил стараетесь заставить его работать иначе, например с помощьюTask.Run
. - person John Wu   schedule 04.02.2020