← Все вопросы

Зачем нужны async и await, если можно просто вызвать метод?

Задан 13 месяцев назад995 просмотров2 ответа
11

Не понимаю смысла async/await. Чем await SomeAsync() лучше обычного синхронного вызова? Поток же всё равно ждёт результат?

async Task<string> GetDataAsync()
{
    await Task.Delay(1000);
    return "готово";
}

2 ответа

18
✓ Принятый ответ — помог автору

Ключевая идея: 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.

8

Главное правило, которое экономит часы отладки: не вызывайте .Result или .Wait() на async-методах — это блокирует поток и в UI/ASP.NET может привести к дедлоку.

// плохо
var x = GetDataAsync().Result; // риск дедлока

// хорошо
var x = await GetDataAsync();

И тащите async по всей цепочке вызовов («async all the way»), а не глушите его в одном месте.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект