Столкнулся с проблемой, что при выполнении асинхронной процедуры клиент полностью повисает и больше ни на что не реагирует.
Причем, повисает не при вызове самого верхнего асинхронного процесса, а если уже во вложенной процедуре идет вызов другой асинхронной функции.
Причину полностью я так и не понял, но, перерыв кучу интернета, нашел какую-то статью, где говорилось, что это может происходить из-за взаимной блокировки асинхронного процесса и процесса контекста вызова этого асинхронного процесса.
То есть головной процесс создает поток и пытается дождаться его окончания (получить ответ) при этом этот новый поток обращается к какой-либо процедуре в головном процессе, но, так как головной процесс ожидает ответа от этого потока, то, соответственно ответа дочерний поток не получает и повисает. Ну и, следовательно, повисает и головной поток, так как ждет ответа от вызванного потока.
Лечится это просто.
Нужно вызывать ожидание ответа не того потока, который создается в асинхронной процедуре, а создавать новый Task (поток) который уже будет ждать ответа вложенного потока. А наша головная программа успешно пойдет дальше.
То есть нужно сделать:
var someResult = Task.Run(someAsyncFunc).GetAwaiter().GetResult(); |
Ограничение тут одно — наша асинхронная функция не должна иметь параметров.
Параметры приходится передавать через внешние к данному асинхронному процессу переменные.
Вызов, который приводит к зависанию:
var someResult = someAsyncFunc().GetAwaiter().GetResult(); |