← Назад к вопросам

Для чего нужен await?

1.3 Junior🔥 261 комментариев
#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Для чего нужен await?

await — это ключевое слово для работы с асинхронными операциями. Оно выполняет две основные функции:

1. Распаковывает результат из Task

Без await получаешь Task, с await — реальный результат:

Task<User> task = _service.GetUserAsync(1);
User user = await _service.GetUserAsync(1);

2. Освобождает поток при ожидании

Это главное преимущество. При await поток не занят операцией:

public async Task<string> FetchGood()
{
    var data = await httpClient.GetStringAsync("https://api.example.com");
    return data;
}

public async Task<string> FetchBad()
{
    var data = httpClient.GetStringAsync("https://api.example.com").Result;
    return data;
}

Во втором случае поток БЛОКИРОВАН всё время, пока ждёт ответа.

Практический пример

[ApiController]
public class UserController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> CreateUserAsync(CreateUserRequest request)
    {
        var user = await _userService.CreateUserAsync(request);
        await _emailService.SendWelcomeEmailAsync(user.Email);
        return Ok(user);
    }
}

Каждый await освобождает поток. В то время как один HTTP-запрос ждёт сохранения в БД, сервер может обработать сотни других запросов этим же потоком.

Параллельное выполнение

var user = await _userService.GetAsync(1);
var posts = await _postService.GetAsync(1);

var tasks = new[]
{
    _userService.GetAsync(1),
    _postService.GetAsync(1)
};
await Task.WhenAll(tasks);

Второй подход быстрее: операции выполняются параллельно, а не последовательно.

Обязательные правила

  • await работает только в async методах
  • async метод должен возвращать Task или Task<T>
  • Никогда не используй .Result или .Wait()

Итого

await позволяет:
  1. Получить результат из Task без блокировки
  2. Писать асинхронный код как синхронный
  3. Одному потоку обрабатывать тысячи операций одновременно
Для чего нужен await? | PrepBro