Middle
Как работи механизмът async/await в C#?
sobes.tech AI
Отговор от 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
// Await чака завършването на заявката без блокиране на нишката
string content = await client.GetStringAsync(url);
// Продължението се изпълнява след получаване на съдържанието
return content.Length;
}
// Използване на асинхронния метод
async void Button_Click(object sender, EventArgs e)
{
// Await чака да приключи GetLengthAsync
// UI нишката не се блокира
int length = await GetLengthAsync("https://example.com");
// Актуализиране на UI елемента
Label1.Text = $"Дължина на съдържанието: {length}";
}