Зачем нужно асинхронное программирование в C#?
Асинхронность нужна чтобы главный "процесс" программы, не блокировал выполнение инструкций. А передавал управление другому независимому потоку/процессу, до тех пор пока прошлый не ответит успехом об успешности завершения выполнения и готовности дальше идти по коду/инструкциям.
Цели: 
 - ускорение работы программы
 - выполнение без блокирующих эффектов (в том числе и в интерфейсе пользователя)
 - многозадачность + многопоточность
Асинхронность, по простому, нужна, чтобы вызывающий поток не находился в состоянии ожидания окончания операции. Польза от асинхронности заметна в основном при операциях ввода/вывода, когда аппаратные средства явно могут уведомить ОС об окончании ввода/вывода. При выполнении вычислительных операций на CPU асинхронность скорее навредит производительности. Читайте Рихтера, у него всё разжевано на примерах.