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.
- Kulcsszó
async: Egy metódust aszinkronná jelöl. Egy ilyen metódus tartalmazhatawaitutasítást. - Kulcsszó
await: Általában egy aszinkron művelet (általábanTaskvagyTask<T>-t visszaadó metódus) hívása előtt használják. Amikor azawaitelé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. Task/Task<T>: Egy ígéretet jelent egy aszinkron művelet befejezésére és eredményére (azTask<T>esetében). Azawait"vár" ennek az "ígéretnek" a befejezésére.- Á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
awaitelérésénél. - 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.
- Visszatérés a vezérléshez: Az aszinkron művelet befejezése után a vezérlés visszatér az
awaitutá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}";
}