Async und Await in C#: Wie und wann man sie verwendet (Schritt-für-Schritt-Tutorial)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Async und Await in C#: Die App vor dem „Einfrieren" bewahren

\n\n

Haben Sie jemals ein Programm in C# gestartet, auf eine Schaltfläche geklickt, und die Benutzeroberfläche „fror" für einige Sekunden ein? Oder hat Ihr Server vielleicht aufgehört, auf neue Anfragen zu antworten, während eine „schwere" Anfrage bearbeitet wurde? Kommt Ihnen bekannt vor? Dies ist das klassische Problem von synchronem Code, bei dem der Ausführungsthread blockiert wird, während er auf den Abschluss einer Operation wartet (Lesen einer Datei, Datenbankabfrage, HTTP-Aufruf).

\n\n

Die Lösung für dieses Problem ist die asynchrone Programmierung. Und in C# sind die wichtigsten Werkzeuge dafür die Schlüsselwörter async und await. Wenn Sie sich jemals gefragt haben: „Wie und wann verwende ich async und await?" – sind Sie hier genau richtig. In diesem Tutorial behandeln wir alles von den Grundlagen bis zu den Best Practices, damit Sie schnellen, reaktionsfähigen und skalierbaren Code schreiben.

\n\n

Dieses Material basiert auf einer echten, beliebten Frage auf Stack Overflow, die tausende von Aufrufen erhalten hat. Wir haben es für Bildungszwecke angepasst und mit Codebeispielen und klaren Erklärungen ergänzt.

\n\n

Was sind async und await? Einfach erklärt

\n\n

Stellen Sie sich vor, Sie sind ein Chefkoch (Ihr Programm). Sie müssen das Abendessen zubereiten. Eines der Gerichte ist eine Suppe, die 30 Minuten kochen muss. In der synchronen Welt würden Sie am Herd stehen und einfach warten, bis die Suppe gar ist, ohne etwas anderes zu tun. Dumm, oder?

\n\n

Asynchronität bedeutet, dass Sie die Suppe zum Kochen bringen (async) und, ohne zu warten, anfangen, den Salat zu schneiden, den Tisch zu decken und sich um andere Dinge zu kümmern. Wenn die Suppe fertig ist, kehren Sie zu ihr zurück (await). Sie verschwenden keine Zeit – Sie sind effizient.

\n\n
    \n
  • async – ein Methodenmodifikator, der dem Compiler sagt: „Diese Methode enthält asynchrone Operationen. Blockiere den Thread nicht, wenn ich auf await treffe."
  • \n
  • await – ein Operator, der auf eine Aufgabe (Task) angewendet wird. Er sagt: „Unterbreche die Ausführung dieser Methode, bis die Aufgabe abgeschlossen ist, aber blockiere den Thread nicht. Sobald die Aufgabe abgeschlossen ist, setze die Ausführung an dieser Stelle fort."
  • \n
\n\n

Wichtig: await blockiert den Thread nicht. Es gibt die Kontrolle an den aufrufenden Code zurück, während der Thread weiterhin andere Arbeit ausführt.

\n\n

Wann sollte man async und await verwenden?

\n\n

Dies ist die häufigste Frage. Die Antwort ist einfach: immer dann, wenn Sie eine Operation ausführen, die viel Zeit in Anspruch nehmen kann (I/O-gebundene Operationen), und Sie den Thread nicht blockieren möchten.

\n\n

Hier sind typische Szenarien:

\n
    \n
  • Netzwerkanfragen: HTTP-Aufrufe (HttpClient), Arbeit mit WebSocket.
  • \n
  • Dateiarbeit: Lesen/Schreiben großer Dateien, Arbeit mit Streams.
  • \n
  • Datenbankabfragen: Entity Framework, ADO.NET, Dapper.
  • \n
  • Arbeit mit Webdiensten: WCF, REST API.
  • \n
  • Alle Ein-/Ausgabeoperationen (I/O): Zugriff auf Festplatte, Netzwerk, Drucker.
  • \n
\n\n

Wann sollte man async und await NICHT verwenden?

\n
    \n
  • CPU-gebundene Operationen: Wenn Ihre Aufgabe intensive Berechnungen erfordert (3D-Rendering, Videobearbeitung, komplexe mathematische Berechnungen), hilft async/await nicht. Hier sollten Sie Task.Run oder Parallel verwenden, um die Arbeit auf mehrere Prozessorkerne zu verteilen.
  • \n
  • In Klassenkonstruktoren: Konstruktoren können nicht async sein. Verwenden Sie Factory-Methoden (public static async Task<MyClass> CreateAsync()).
  • \n
  • In Gettern/Settern von Eigenschaften: Auch diese können nicht async sein. Verwenden Sie Methoden.
  • \n
\n\n

Wie funktioniert es? Analyse anhand von Codebeispielen

\n\n

Schauen wir uns echten Code an. Stellen Sie sich vor, wir laden Daten von einem entfernten Server herunter.

\n\n

Schlechtes Beispiel (synchron)

\n
public string GetDataFromWeb()\n{\n    usi                

Blogs

Buchempfehlungen