Sobes.tech
Middle

Hogyan működik az async/await mechanizmus C#-ban?

sobes.tech MI

Válasz az MI-től

Az async/await mechanizmus lehetővé teszi az aszinkron kód írását, amely szinkronnak tűnik.

  1. Kulcsszó async: Egy metódust aszinkronná jelöl. Egy ilyen metódus tartalmazhat await utasítást.
  2. Kulcsszó await: Általában egy aszinkron művelet (általában Task vagy Task<T>-t visszaadó metódus) hívása előtt használják. Amikor az await eléri a végrehajtást, a vezérlés visszatér a hívó metódushoz, és a felszabadult szál más feladatokat végezhet.
  3. Task / Task<T>: Egy ígéretet jelent egy aszinkron művelet befejezésére és eredményére (az Task<T> esetében). Az await "vár" ennek az "ígéretnek" a befejezésére.
  4. Állapotgép: A fordító az aszinkron metódust egy állapotgéppé alakítja. Ez az állapot megőrzi a metódus állapotát az await elérésénél.
  5. Folytatás: Amikor a várt feladat befejeződik, a futtatókörnyezet ütemezi a maradék rész (folytatás) végrehajtását egy szálon a szálkészletből vagy ugyanabban a szinkronizációs kontextusban, ha az elfogásra került.
  6. Visszatérés a vezérléshez: Az aszinkron művelet befejezése után a vezérlés visszatér az await utáni pontra, és a metódus végrehajtása a mentett állapottal folytatódik.
// Aszinkron metódus
async Task<int> GetLengthAsync(string url)
{
    // HTTP kliens létrehozása
    using var client = new HttpClient(); 
    // Aszinkron kérés végrehajtása az URL-re
    // Az await várakozik a kérés befejezésére anélkül, hogy blokkolná a szálat
    string content = await client.GetStringAsync(url); 
    // A folytatás a tartalom megszerzése után fut le
    return content.Length; 
}

// Az aszinkron metódus használata
async void Button_Click(object sender, EventArgs e)
{
    // Az await várja, hogy a GetLengthAsync befejeződjön
    // A UI szál nem blokkolódik
    int length = await GetLengthAsync("https://example.com"); 
    // UI elem frissítése
    Label1.Text = $"Tartalom hossza: {length}"; 
}