Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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
    // 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}"; 
}