Назад к вопросам
Middle
113
questionbank

Как работает механизм async/await в C#?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Механизм async/await позволяет писать асинхронный код, который выглядит как синхронный.

  1. Ключевое слово async: Помечает метод как асинхронный. Такой метод может содержать оператор await.
  2. Ключевое слово await: Используется перед вызовом асинхронной операции (обычно метода, возвращающего Task или Task<T>). Когда выполнение доходит до await, управление возвращается вызывающему методу, а освободившийся поток может выполнять другую работу.
  3. Task / Task<T>: Представляет собой обещание завершения асинхронной операции и ее результат (для Task<T>). await "ожидает" завершения этого "обещания".
  4. Состояние машины: Компилятор преобразует асинхронный метод в конечный автомат. Этот автомат сохраняет состояние метода при достижении await.
  5. Продолжение: Когда ожидаемая задача завершается, среда выполнения планирует выполнение оставшейся части асинхронного метода (продолжения) на потоке из пула потоков или на том же контексте синхронизации, если он захвачен.
  6. Возврат управления: После завершения асинхронной операции, управление возвращается к точке после await, и выполнение метода продолжается с сохраненным состоянием.
// Асинхронный метод
async Task<int> GetLengthAsync(string url)
{
    // Создаем HTTP-клиент
    using var client = new HttpClient(); 
    // Выполняем асинхронный запрос к URL
    // Авейт ждет завершения запроса без блокировки потока
    string content = await client.GetStringAsync(url); 
    // Продолжение выполняется после получения контента
    return content.Length; 
}

// Использование асинхронного метода
async void Button_Click(object sender, EventArgs e)
{
    // Авейт ждет завершения GetLengthAsync
    // UI-поток не блокируется
    int length = await GetLengthAsync("https://example.com"); 
    // Обновляем UI-элемент
    Label1.Text = $"Длина контента: {length}"; 
}