Назад к вопросам
Middle
113
questionbank
Как работает механизм async/await в C#?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Механизм async/await позволяет писать асинхронный код, который выглядит как синхронный.
- Ключевое слово
async: Помечает метод как асинхронный. Такой метод может содержать операторawait. - Ключевое слово
await: Используется перед вызовом асинхронной операции (обычно метода, возвращающегоTaskилиTask<T>). Когда выполнение доходит доawait, управление возвращается вызывающему методу, а освободившийся поток может выполнять другую работу. Task/Task<T>: Представляет собой обещание завершения асинхронной операции и ее результат (дляTask<T>).await"ожидает" завершения этого "обещания".- Состояние машины: Компилятор преобразует асинхронный метод в конечный автомат. Этот автомат сохраняет состояние метода при достижении
await. - Продолжение: Когда ожидаемая задача завершается, среда выполнения планирует выполнение оставшейся части асинхронного метода (продолжения) на потоке из пула потоков или на том же контексте синхронизации, если он захвачен.
- Возврат управления: После завершения асинхронной операции, управление возвращается к точке после
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}";
}