async ·
await ·
Task ·
CancellationToken ·
WhenAll / WhenAny ·
ConfigureAwait
Async/Await ist das Herzstück der asynchronen Programmierung in C#. Es ermöglicht die Entwicklung reaktionsfähiger Anwendungen ohne Blockierung des Hauptthreads.
async kennzeichnet eine Methode als asynchron. await wartet auf den Abschluss einer asynchronen Operation, ohne den Thread zu blockieren. Der Rückgabetyp ist Task (für void) oder Task<T> (für Werte).
| Regel | Beschreibung |
|---|---|
| async Task | Für Methoden ohne Rückgabewert (void) |
| async Task<T> | Für Methoden mit Rückgabewert vom Typ T |
| await | Nur in async-Methoden verwendbar |
| Naming | Konvention: Methodenname endet mit "Async" |
| return | Gibt den Wert zurück (bei Task<T>) |
async void – verwenden Sie async Task für bessere Fehlerbehandlung.
Task repräsentiert eine asynchrone Operation. Task<T> repräsentiert eine asynchrone Operation, die einen Wert vom Typ T zurückgibt. Tasks können mit Task.Run() gestartet oder über Task.FromResult() bereits abgeschlossen sein.
Task.Run() startet eine Operation auf dem ThreadPool. Für I/O-gebundene Operationen verwenden Sie besser die nativen Async-Methoden (z.B. HttpClient.GetStringAsync).
CancellationToken ermöglicht das kooperative Abbrechen asynchroner Operationen. Die Operation prüft regelmäßig, ob ein Abbruch angefordert wurde, und beendet sich selbst.
ThrowIfCancellationRequested() für eine saubere Abbruchbehandlung. Für Timeouts nutzen Sie CancellationTokenSource(TimeSpan).
Task.WhenAll wartet auf die Fertigstellung aller angegebenen Tasks. Task.WhenAny wartet auf die Fertigstellung des ersten Tasks (wird in Rennen verwendet).
Task.WhenAny können Sie Timeouts implementieren oder die schnellste Antwort aus mehreren Quellen verwenden.
Fehlerbehandlung in asynchronen Methoden funktioniert ähnlich wie bei synchronen Methoden – mit try/catch. Bei Task.WhenAll können mehrere Fehler in einer AggregateException auftreten.
Task.WhenAll werden alle Fehler in einer AggregateException gesammelt. Verwenden Sie await für jeden Task einzeln, um sofort auf den ersten Fehler zu reagieren.
ConfigureAwait(false) verhindert, dass die Fortsetzung nach dem await zum ursprünglichen Synchronisationskontext zurückkehrt. Dies verbessert die Leistung und verhindert Deadlocks in Bibliotheken.
ConfigureAwait(false) verwenden. In UI-Anwendungen (WPF, WinForms) kann darauf verzichtet werden, um den UI-Thread für UI-Updates zu behalten.
async
Task
Cancel
WhenAll
try-catch
ConfigureAwait
public async Task<string> FetchAsync() { await ... } ·
await Task.WhenAll(tasks)