Wissen von A bis Z

async / await

Warten ohne Stillstand: Mit async/await macht Ihr Code eine Kaffeepause, während die Daten noch im Stau stehen, ohne dabei die ganze Firma lahmzulegen.

async/await ist das Sprachfeature von C# (und VB.NET), mit dem asynchrone Operationen sequentiell wirkender, leicht lesbarer Codepfade ausgedrückt werden. Der Compiler transformiert async-Methoden in eine State-Machine, die in Kombination mit der Task Parallel Library (TPL) den Code so umstrukturiert, dass blockierende Wartepunkte (z. B. auf I/O) den Thread freigeben, bis das erwartete Ergebnis verfügbar ist.

Eingesetzt wird async/await in praktisch jeder modernen .NET-Anwendung: bei Datenbankzugriffen mit Entity Framework Core, in HTTP-Aufrufen mit HttpClient, beim Lesen und Schreiben von Dateien, in ASP.NET-Core-Pipelines, in WPF/MAUI/Blazor-UI-Code (um den UI-Thread nicht zu blockieren) und in Hintergrunddiensten. Spezialisierte Erweiterungen sind ConfigureAwait(false) für Bibliothekscode, ValueTask für Hochleistungsszenarien sowie IAsyncEnumerable für asynchrone Streams.

Der Einsatzzweck und das gelöste Problem liegen im Umgang mit gleichzeitig vielen langlaufenden I/O-Operationen. Klassische Thread-pro-Anfrage-Modelle skalieren schlecht, weil Threads teuer sind und blockierende Aufrufe die Threadpool-Auslastung treiben. async/await ermöglicht ein nebenläufiges, aber nicht zwangsläufig parallel ausgeführtes Modell, in dem Tausende offene Operationen mit wenigen Threads bedient werden können. Damit lassen sich Web-APIs, Streaming-Dienste und reaktive UI-Anwendungen mit drastisch geringerem Ressourcenverbrauch realisieren.

Historisch wurde async/await mit C# 5 und dem .NET Framework 4.5 im August 2012 eingeführt. Vorbild war eine Reihe akademischer und industrieller Vorarbeiten zu kontinuationsbasierten asynchronen Modellen, insbesondere F#-Async-Workflows (2007) und C#-Iteratoren (yield return, C# 2.0). Spätere Versionen brachten Task als Standardrückgabetyp, generalisierte awaitable types, ValueTask, async Main, asynchrone Streams (C# 8) und ein zunehmend optimiertes Codegen-Modell.

Eingeführt wurde async/await von Microsoft unter Federführung von Anders Hejlsberg, Mads Torgersen und Stephen Toub, der für das tieferliegende Threadpool- und Synchronisationsverhalten verantwortlich zeichnet. Anders Hejlsberg hat in mehreren Vorträgen erläutert, dass async/await die Zusage einlöst, asynchrone Programmierung ‚so einfach wie synchrone zu machen, ohne synchrone Performance-Falsifikate' — und dass die Idee, das Schlüsselwort await zu nennen, statt eines kürzeren Tokens, bewusst das ‚Warten' im natürlichen Sprachsinn betonen sollte. Async/await ist seither in nahezu alle relevanten Mainstream-Sprachen (JavaScript, Python, Rust, TypeScript, Swift, Kotlin) übernommen worden.

Zurück