Вы можете заблокировать асинхронный код - но вы не должны
Первое и наиболее очевидное следствие - отсутствие контекста, захваченного await,Это означает, что блокировка асинхронного кода не приведет к взаимоблокировке.Вы можете использовать Task.GetAwaiter (). GetResult () (или Task.Wait или Task.Result), не опасаясь тупиковой ситуации.Тем не менее, вы не должны.Поскольку в тот момент, когда вы блокируете асинхронный код, вы в первую очередь отказываетесь от всех преимуществ асинхронного кода.Расширенная масштабируемость асинхронных обработчиков аннулируется, как только вы блокируете поток.В (устаревшем) ASP.NET было несколько сценариев, где блокировка, к сожалению, была необходима: фильтры ASP.NET MVC и дочерние действия.Однако в ASP.NET Core весь конвейер полностью асинхронный;оба фильтра и компоненты представления выполняются асинхронно.В заключение, в идеале вы должны стремиться использовать асинхронный полностью;но если ваш код нуждается в этом, он может блокировать без опасности.
- Извлечение из блога Стивена Клири
Кредит GSerg для поиска сообщения
Однако вы можете столкнуться с голоданием пула потоков
http://labs.criteo.com/2018/10/net-threadpool-starvation-and-how-queuing-makes-it-worse/