Не понимаю зачем использовать async await, перечитал много статей, но смысл не понял.
Ведь результат тот же, если метод делать не асинхронным.
Или, это нужно только для того, чтобы не морозить основной поток, но при этом не продолжать выполнение, пока не выполнится вторичный поток?
super15, изначально я хотел объяснить разницу между асинхронностью и многопоточностью в двух словах. У многих на начальном этапе уже есть недопонимания по различиям в двух концепциях.
Что касается фоновых потоков: «The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread».
Изначально async/await появились как способ изничтожить лаги окошек при I/O операциях. Раньше для этого требовалось создавать поток или возится с колбеками асинхронных функций и запускать Form.Invoke для доступа к форме. Асинхронные же обработчики событий не вешают основной поток и всегда выполняются в потоке формы.
Когда код встречает await, то немедленно возвращает поток в ThreadPool. Это позволяет параллельно обрабатывать множество задач нуждающихся в I/O, ограниченным числом потоков. Большое число потоков может выжрать всю виртуальную память, что не есть хорошо. Но есть и жирные минусы, lock не работает, скорость выполнения кода ниже.
Это сахар, замораживающий текущую позицию выполнения в методе, пока выполняется асинхронный метод. Он заменяет создание потока, запуск потока, вызов коллбека по завершению потока. Так же он позволяет не выделять нижестоящий код в коолбек-метод.
async/await нужен для оптимального использования ресурсов системы, существуют два вида тасок - таски ввода/вывода и таски многопотока, так вот при операциях IO нет смысла держать текущий поток, можно дать попользоваться ресурсами CPU тем кому нужнее, так вот раньше нужно было использовать IAsyncResult, это было неудобно, теперь для это есть синтаксический сахар и единый подход работы с асинхроностью и многопотоком