GetJsonAsync
не выполняется в потоке произвольного пула потоков. Он выполняется в потоке контекста.
В соответствии с примером кода задача GetJsonAsync
была создана событием нажатия кнопки, которое выполняется в потоке пользовательского интерфейса (потоке контекста). Когда задача находится в ожидании, текущий контекст (в данном случае контекст синхронизации пользовательского интерфейса) фиксируется. После завершения задачи возобновление продолжается в том же контексте.
На шаге 7 задача пытается вернуться в поток пользовательского интерфейса, но поток пользовательского интерфейса блокируется .Result
, ожидая, что задача будет завершена. возвращение. Таким образом, возникает тупик.
Я заметил, что упомянутый вопрос задавался о ASP. NET приложениях WebApi. Так что просто хочу уточнить некоторые моменты:
ASP. Net У WebAPI есть специальный контекст синхронизации, но он отличается от контекста пользовательского интерфейса. Существует только один поток пользовательского интерфейса, поэтому контекст планирует обратные вызовы / продолжения только для потока пользовательского интерфейса.
Однако контекст синхронизации для ASP. Net WebAPI не захватывает один единственный поток. Код ASP. Net может выполняться в другом / произвольном потоке. Контекст отвечает за восстановление данных потока и обеспечение того, чтобы продолжения были объединены в цепочку в порядке очереди.