Сделать асинхронный код похожим на обычный — это сама по себе большая проблема, потому что раньше каждую последовательность операций приходилось разбивать на небольшие части (по границам асинхронных операций) и вызывать необходимую часть в нужное время. Неудивительно, что это приводит к путанице при написании кода.
C# Concurrency. Асинхронное программирование и многопоточность
·
Нир Добовицки