← SEARCHABLE ARCHIVE
C# · 2026-08-07

C# von den Grundlagen bis zum Profi — Folge 8

Erstellen asynchroner Aufgaben mit Async und Wait

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Das Blockieren eines Threads während des Wartens auf einen Netzwerk- oder Dateivorgang kann ebenfalls zum Einfrieren des Bildschirms und anderer Vorgänge führen. Async und Wait drücken die wartende Aufgabe aus, sodass sie kontinuierlich ausgeführt werden kann.

Zurückkehrende Aufgabe

async Task<PlayerData> LoadPlayerAsync(
    string url,
    CancellationToken cancellationToken)
{
    using HttpResponseMessage response =
        await httpClient.GetAsync(url, cancellationToken);

    response.EnsureSuccessStatusCode();

    PlayerData? data = await response.Content
        .ReadFromJsonAsync<PlayerData>(cancellationToken);

    return data ?? throw new InvalidDataException("Player data is empty");
}

Wenn Sie auf „await“ stoßen, können Sie später mit dem Rest Ihres Codes fortfahren, anstatt am aktuellen Thread festzuhalten, bis die Aufgabe abgeschlossen ist. Asynchrone Methoden geben grundsätzlich eine Aufgabe zurück, damit der Aufrufer den Abschluss und Fehler beobachten kann.

Weiterleiten abbrechen

using var source = new CancellationTokenSource(TimeSpan.FromSeconds(5));

try
{
    PlayerData data = await LoadPlayerAsync(url, source.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("Loading canceled");
}

Abbrechen ist keine Funktion, die einen Thread zwangsweise beendet. Ein Vertrag, der eine Aufgabe anfordert, ein Token zu überprüfen und an einem sicheren Punkt abzubrechen.

Warten auf mehrere Aufgaben

Task<ItemData> itemTask = LoadItemsAsync(token);
Task<QuestData> questTask = LoadQuestsAsync(token);

await Task.WhenAll(itemTask, questTask);

ItemData items = await itemTask;
QuestData quests = await questTask;

Wartende Aufgaben, die nicht voneinander abhängig sind, können zuerst gestartet werden und dann gemeinsam warten. Das bloße Markieren einer CPU-Berechnung als asynchron macht sie nicht automatisch parallel.

Strömung zu vermeiden

Synchrones Warten mit .Result oder .Wait() der Aufgabe kann je nach Ausführungsumgebung Threads blockieren oder einen Deadlock erzeugen. Besser ist es, den Aufrufpfad möglichst asynchron weiterzuführen.

async void sollte außer in Ereignishandlern vermieden werden, da der Aufrufer nicht auf den Abschluss und Ausnahmen warten kann. Der Schlüssel zu asynchronem Code besteht nicht darin, Schlüsselwörter hinzuzufügen, sondern dem Aufrufer den Ablauf von Abschluss, Fehler und Abbruch zu vermitteln.