Sobes.tech
Middle

Wie funktioniert der async/await-Mechanismus in C#?

sobes.tech KI

Antwort von AI

Der Mechanismus async/await ermöglicht es, asynchronen Code zu schreiben, der wie synchroner Code aussieht.

  1. Schlüsselwort async: Markiert eine Methode als asynchron. Eine solche Methode kann die Anweisung await enthalten.
  2. Schlüsselwort await: Wird vor dem Aufruf einer asynchronen Operation verwendet (normalerweise eine Methode, die Task oder Task<T> zurückgibt). Wenn die Ausführung await erreicht, wird die Kontrolle an die aufrufende Methode zurückgegeben, und der freigegebene Thread kann eine andere Arbeit ausführen.
  3. Task / Task<T>: Repräsentiert ein Versprechen, eine asynchrone Operation abzuschließen und ihr Ergebnis (bei Task<T>) zu liefern. await "wartet" auf die Fertigstellung dieses "Versprechens".
  4. Zustandsautomat: Der Compiler wandelt die asynchrone Methode in einen Zustandsautomaten um. Dieser speichert den Zustand der Methode beim Erreichen von await.
  5. Fortsetzung: Wenn die erwartete Aufgabe abgeschlossen ist, plant die Laufzeitumgebung die Ausführung des verbleibenden Teils der asynchronen Methode (der Fortsetzung) auf einem Thread aus dem Thread-Pool oder im selben Synchronisierungskontext, falls dieser eingefangen wurde.
  6. Rückgabe der Kontrolle: Nach Abschluss der asynchronen Operation kehrt die Kontrolle an die Stelle nach await zurück, und die Ausführung der Methode setzt mit dem gespeicherten Zustand fort.
// Asynchrone Methode
async Task<int> GetLengthAsync(string url)
{
    // HTTP-Client erstellen
    using var client = new HttpClient(); 
    // Asynchrone Anfrage an die URL
    // Await wartet auf Abschluss der Anfrage, ohne den Thread zu blockieren
    string content = await client.GetStringAsync(url); 
    // Fortsetzung erfolgt nach Erhalt des Inhalts
    return content.Length; 
}

// Verwendung der asynchronen Methode
async void Button_Click(object sender, EventArgs e)
{
    // Await wartet auf GetLengthAsync
    // UI-Thread wird nicht blockiert
    int length = await GetLengthAsync("https://example.com"); 
    // UI-Element aktualisieren
    Label1.Text = $"Inhaltslänge: {length}"; 
}