Sobes.tech
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.

  1. Słowo kluczowe async: Oznacza metodę jako asynchroniczną. Taka metoda może zawierać instrukcję await.
  2. Słowo kluczowe await: Używane przed wywołaniem operacji asynchronicznej (zwykle metody zwracającej Task lub Task<T>). Gdy wykonanie dotrze do await, kontrola wraca do wywołującej metody, a zwolniony wątek może wykonywać inną pracę.
  3. Task / Task<T>: Reprezentuje obietnicę zakończenia operacji asynchronicznej i jej wynik (dla Task<T>). await "oczekuje" na zakończenie tej "obietnicy".
  4. Maszyna stanów: Kompilator przekształca metodę asynchroniczną w maszynę stanów. Ta maszyna zapisuje stan metody przy osiągnięciu await.
  5. 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.
  6. 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}"; 
}