Компилятор не делит код на разные методы, а создает единый метод, реализующий конечный автомат, который отслеживает текущее состояние с помощью переменной и использует большой оператор switch для запуска нужного фрагмента кода.
• Вместо ContinueWith компилятор использует внутренний объект, так называемый awaiter. Я же использовал метод ContinueWith в примере, потому что он концептуально похож, и если вы не собираетесь писать свой компилятор или свою поддержку асинхронного выполнения для .NET, то помнить об этом совершенно необязательно.
• На самом деле инструкция await делает гораздо больше, чем ContinueWith, — она не только запускает обратный вызов после завершения задачи, как это делает ContinueWith, но и выполняет ряд дополнительных полезных действий, о которых мы поговорим позже в этой книге.