Sobes.tech
Middle

Kako funkcioniše mehanizam async/await u C#?

sobes.tech АИ

Одговор од АИ

Механизам async/await омогућава писање асинхроног кода који изгледа као синхрона.

  1. Кључна реч async: Означава метод као асинхрона. Тај метод може садржати инструкцију await.
  2. Кључна реч await: Користи се пре позива асинхроне операције (обично метода која враћа Task или Task<T>). Када се извршавање доведе до await, контролу се враћа позивајућој методи, а ослобођени нит може извршавати другу радњу.
  3. Task / Task<T>: Представља обећање о завршетку асинхроне операције и њеном резултату (за Task<T>). await "чека" завршетак овог "обећања".
  4. Машина стања: Компилатор претвара асинхрони метод у машину стања. Ова машина чува стање метода при достижењу await.
  5. Наставак: Када се очекивани задатак заврши, окружење за извршавање планира извршавање преосталог дела асинхроног метода (наставка) на нит из пул-а или у истом синхронизованом контексту ако је ухваћен.
  6. Повратак контроле: Након што асинхрона операција заврши, контролa се враћа на тачку после 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}"; 
}