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}"; 
}