async/await нужен для оптимального использования ресурсов системы, существуют два вида тасок - таски ввода/вывода и таски многопотока, так вот при операциях IO нет смысла держать текущий поток, можно дать попользоваться ресурсами CPU тем кому нужнее, так вот раньше нужно было использовать IAsyncResult, это было неудобно, теперь для это есть синтаксический сахар и единый подход работы с асинхроностью и многопотоком