Зачем нужны async и await, если можно просто вызвать метод?
Не понимаю смысла async/await. Чем await SomeAsync() лучше обычного синхронного вызова? Поток же всё равно ждёт результат?
async Task<string> GetDataAsync()
{
await Task.Delay(1000);
return "готово";
}
2 ответа
Ключевая идея: await не блокирует поток, пока операция выполняется. В этом вся суть.
Когда вы делаете синхронный вызов сетевого запроса, поток просто стоит и ждёт ответа — впустую занимая ресурс. С await поток освобождается и может делать другую работу; когда результат готов, выполнение продолжается с того же места.
async Task<string> LoadAsync()
{
Console.WriteLine("старт");
string data = await DownloadAsync(); // поток освобождён на время ожидания
Console.WriteLine("получили");
return data;
}
Зачем это важно:
- В UI (WPF/WinForms/MAUI) — интерфейс не «замерзает», пока идёт загрузка.
- На сервере (ASP.NET) — один поток обслуживает много запросов; нет блокировки = выше пропускная способность.
Важно: await сам по себе не создаёт параллелизма. Он про неблокирующее ожидание I/O. Если внутри тяжёлый CPU-расчёт — его надо обернуть в Task.Run.
Главное правило, которое экономит часы отладки: не вызывайте .Result или .Wait() на async-методах — это блокирует поток и в UI/ASP.NET может привести к дедлоку.
// плохо
var x = GetDataAsync().Result; // риск дедлока
// хорошо
var x = await GetDataAsync();
И тащите async по всей цепочке вызовов («async all the way»), а не глушите его в одном месте.