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.
- Schlüsselwort
async: Markiert eine Methode als asynchron. Eine solche Methode kann die Anweisungawaitenthalten. - Schlüsselwort
await: Wird vor dem Aufruf einer asynchronen Operation verwendet (normalerweise eine Methode, dieTaskoderTask<T>zurückgibt). Wenn die Ausführungawaiterreicht, wird die Kontrolle an die aufrufende Methode zurückgegeben, und der freigegebene Thread kann eine andere Arbeit ausführen. Task/Task<T>: Repräsentiert ein Versprechen, eine asynchrone Operation abzuschließen und ihr Ergebnis (beiTask<T>) zu liefern.await"wartet" auf die Fertigstellung dieses "Versprechens".- Zustandsautomat: Der Compiler wandelt die asynchrone Methode in einen Zustandsautomaten um. Dieser speichert den Zustand der Methode beim Erreichen von
await. - 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.
- Rückgabe der Kontrolle: Nach Abschluss der asynchronen Operation kehrt die Kontrolle an die Stelle nach
awaitzurü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}";
}