Asynchrone Programmierung in C#: Vollständiger Leitfaden mit Beispielen

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

Asynchrone Programmierung in C#: Vollständiger Leitfaden in der Praxis



Asynchrone Programmierung ist eines der Schlüsselkonzepte der modernen Entwicklung mit C# und der .NET-Plattform. Sie ermöglicht die Erstellung reaktionsfähiger Anwendungen, die den Ausführungs-Thread nicht blockieren, während auf langwierige Operationen gewartet wird: Dateilesen, Datenbankabfragen, HTTP-Aufrufe. In diesem Leitfaden werden wir anhand praktischer Beispiele mit den Schlüsselwörtern async und await sowie bewährten Methoden erläutern, wie Asynchronität in C# funktioniert.



Was ist asynchrone Programmierung und warum wird sie benötigt?



In der synchronen Programmierung wird jede Operation sequenziell ausgeführt. Wenn eine Methode beispielsweise das Herunterladen von Daten aus dem Netzwerk aufruft, wird der Ausführungs-Thread blockiert, bis diese Operation abgeschlossen ist. Dies führt zum „Einfrieren" der Benutzeroberfläche in Desktop-Anwendungen oder zu einer ineffizienten Nutzung von Serverressourcen in Webanwendungen.



Asynchrone Programmierung löst dieses Problem: Der Thread wird nicht blockiert, sondern kehrt in den Thread-Pool zurück, um andere Aufgaben zu bearbeiten. Wenn die Operation abgeschlossen ist, wird die Ausführung an der Stelle fortgesetzt, an der sie unterbrochen wurde.



Die Hauptvorteile der Asynchronität in C#:

  • Reaktionsfähigkeit der UI — Die Anwendung friert bei langen Operationen nicht ein.
  • Skalierbarkeit von Servern — Ein Thread kann viele Anfragen bedienen.
  • Effiziente Ressourcennutzung — Weniger Thread-Leerlaufzeiten.


Grundlagen von async und await in C#



Die Schlüsselwörter async und await sind syntaktischer Zucker, der die Arbeit mit asynchronen Operationen vereinfacht. Betrachten wir ein grundlegendes Beispiel:



using System;using System.Net.Http;using System.Threading.Tasks;

public class AsyncExample{ public async Task<string> DownloadDataAsync(string url) { using (var client = new HttpClient()) { // await blockiert den Thread nicht string result = await client.GetStringAsync(url); return result; } }

public async Task RunAsync() { Console.WriteLine("Starte Download..."); string data = await DownloadDataAsync("https://api.example.com/data"); Console.WriteLine($"Geladen: {data.Length} Zeichen"); }}


Erklärung zum Code:

  • Die Methode ist mit async markiert — dies erlaubt die Verwendung von await darin.
  • Der Rückgabetyp ist Task<string> (oder einfach Task für void-Methoden).
  • await unterbricht die Ausführung der Methode, bis das Ergebnis vorliegt, blockiert aber nicht den Thread.


Wichtig: Die Main-Methode in einer Konsolenanwendung ab C# 7.1+ kann ebenfalls asynchron sein:

static async Task Main(string[] args){    var example = new AsyncExample();    await example.RunAsync();}


Arbeiten mit Task und Task<T>



Der Typ Task repräsentiert einen asynchronen Vorgang. Er kann sich in folgenden Zuständen befinden: Ausstehend (Pending), Wird ausgeführt (Running), Abgeschlossen (Completed), Fehlerhaft (Faulted) oder Abgebrochen (Canceled).



Betrachten wir das manuelle Erstellen und Starten von Aufgaben:



public async Task ProcessDataAsync(){    // Erstellen einer Aufgabe, die im Thread-Pool ausgeführt wird    Task<int> task = Task.Run(() =>    {        // Simulation einer langwierigen Arbeit        Task.Delay(2000).Wait();        return 42;    });

// Warten auf das Ergebnis int result = await task; Console.WriteLine($"Ergebnis: {result}");}


Für die parallele Ausführung mehrerer Aufgaben verwenden Sie Task.WhenAll:



public async Task DownloadMultipleAsync(){    var urls = new[] { "https://site1.com", "https://site2.com", "https://site3.com" };    var tasks =                

Blogs

Buchempfehlungen