Middle
Jak działa mechanizm async/await w C#?
sobes.tech AI
Odpowiedź od AI
Mechanizm async/await pozwala pisać kod asynchroniczny, który wygląda jak synchroniczny.
- Słowo kluczowe
async: Oznacza metodę jako asynchroniczną. Taka metoda może zawierać instrukcjęawait. - Słowo kluczowe
await: Używane przed wywołaniem operacji asynchronicznej (zwykle metody zwracającejTasklubTask<T>). Gdy wykonanie dotrze doawait, kontrola wraca do wywołującej metody, a zwolniony wątek może wykonywać inną pracę. Task/Task<T>: Reprezentuje obietnicę zakończenia operacji asynchronicznej i jej wynik (dlaTask<T>).await"oczekuje" na zakończenie tej "obietnicy".- Maszyna stanów: Kompilator przekształca metodę asynchroniczną w maszynę stanów. Ta maszyna zapisuje stan metody przy osiągnięciu
await. - Kontynuacja: Gdy oczekiwane zadanie się kończy, środowisko wykonawcze planuje wykonanie pozostałej części metody asynchronicznej (kontynuacji) na wątku z puli lub w tym samym kontekście synchronizacji, jeśli jest on przechwycony.
- Powrót kontroli: Po zakończeniu operacji asynchronicznej kontrola wraca do punktu po
await, a wykonanie metody kontynuuje z zapisanym stanem.
// Metoda asynchroniczna
async Task<int> GetLengthAsync(string url)
{
// Tworzymy klienta HTTP
using var client = new HttpClient();
// Wykonujemy asynchroniczne żądanie do URL
// Await czeka na zakończenie żądania bez blokowania wątku
string content = await client.GetStringAsync(url);
// Kontynuacja wykonywana po otrzymaniu zawartości
return content.Length;
}
// Użycie metody asynchronicznej
async void Button_Click(object sender, EventArgs e)
{
// Await czeka na zakończenie GetLengthAsync
// Wątek UI nie jest blokowany
int length = await GetLengthAsync("https://example.com");
// Aktualizacja elementu UI
Label1.Text = $"Długość zawartości: {length}";
}