Как отмечает @ Пауло в комментариях, это полностью зависит от того, как написан код. Легко написать собственный асинхронный код, который никогда не возвращается, и тривиально заблокировать ваше приложение с помощью API платформы, выполнив .Wait()
из потока пользовательского интерфейса.
По сути, асинхронная операция - это функция, которая возвращает объект (часто называемый «обещанием» или «будущим»), а затем этот объект либо устанавливает событие, либо вызывает функцию обратного вызова в некоторый момент времени в будущем (это «логическое» возвращаемое значение асинхронной операции).
Любая часть этого может потерпеть неудачу - первоначальная функция может никогда не вернуться к возвращению объекта обещания, или обещание может никогда не дойти до вызова обратного вызова / установки события.