Ссылки для изучения асинхронности в C#.
Первый гигант async/await - Stephen Cleary. Вводная статья.
Статья об устройстве async/await под капотом. Не обязательно заучивать всю машину состояний под await, но тут как с блоком итератора yield - код пишется, а руки трясутся.
На этом этапе может начаться каша в голове и встреча с SynchronizationContext. Начать можно с этой статьи на MSDN. Но если она покажется душной, переходите к пункту 5.
Второй гигант, и тоже Stephen. Я советую перечитать все статьи обоих, что можно найти. Но продолжая тему контекста синхронизации - эта статья крайне важна для тех, кто тренируется в консольных приложениях. Вопрос об асинхронности/многопоточности уходит после нее. И небольшой, но классный ответ на SO о TaskScheduler.
Но если он все же не ушел - There is no thread. Также советую загуглить словосочетание из этой статьи - naturally-asynchronous operations.
Для закрепления пунктов 4,5,6 можно почитать о Task.Run() и комплексных случаях использования многопоточности и асинхронности. Внутри этого блока статей много полезных ссылок и на другие материалы.
Лучшие практики от Cleary. Кстати, у него есть книга по асинхронности, но лично не читал, отзывы не понравились.