Zum Hauptinhalt springen

Auf einen Task Warten

Die folgenden Möglichkeiten bestehen, um auf Tasks zu warten.

MethodeBeschreibung
Task.Wait()Blockiert den aktuellen Thread, bis der Task abgeschlossen ist. Wenn der Task fehlschlägt, wird eine Ausnahme ausgelöst.
Task.ResultGibt das Ergebnis des Task zurück und blockiert dabei den aktuellen Thread, bis der Task abgeschlossen ist. Wenn der Task fehlschlägt, wird eine Ausnahme ausgelöst.
Task.WaitAll(Task[])Blockiert den aktuellen Thread, bis alle Tasks in einem Array abgeschlossen sind. Wenn einer der Tasks fehlschlägt, wird eine Ausnahme ausgelöst.
Task.WhenAll(Task[])Gibt einen Task zurück, der erst abgeschlossen ist, wenn alle Tasks in einem Array abgeschlossen sind. Wenn einer der Tasks fehlschlägt, schlägt auch der zurückgegebene Task fehl.
Task.WaitAny(Task[])Blockiert den aktuellen Thread, bis einer der Tasks in einem Array abgeschlossen ist. Gibt den Index des abgeschlossenen Tasks im Array zurück. Wenn keiner der Tasks abgeschlossen wird, blockiert die Methode weiterhin den Thread.
Task.WhenAny(Task[])Gibt einen Task zurück, der abgeschlossen ist, sobald einer der Tasks in einem Array abgeschlossen ist. Gibt den abgeschlossenen Task zurück. Wenn keiner der Tasks abgeschlossen wird, blockiert die Methode weiterhin den Thread. Wenn der zurückgegebene Task fehlschlägt, schlägt auch die Methode fehl.
Task.Wait(TimeSpan)Blockiert den aktuellen Thread, bis der Task abgeschlossen ist oder die angegebene Zeit überschritten ist. Gibt true zurück, wenn der Task abgeschlossen wurde, bevor die Zeit abgelaufen ist, andernfalls false.
Task.Delay(TimeSpan)Gibt einen Task zurück, der nach einer angegebenen Zeit abgeschlossen wird. Blockiert den aktuellen Thread nicht.
Task.ConfigureAwait(bool)Konfiguriert, wie ein Task auf einen Threadkontext zurückkehrt. Wenn true übergeben wird, kehrt der Task auf dem Threadkontext zurück, auf dem er gestartet wurde. Wenn false übergeben wird, kehrt der Task auf einem Threadpool-Thread zurück. Diese Methode wird häufig in Kombination mit await verwendet.
Task.RunSynchronously()Führt den Task synchron auf dem aktuellen Thread aus. Dies ist normalerweise nicht empfohlen, da es den aktuellen Thread blockiert und zu Deadlocks führen kann.

Schlüsselwörter await und async

In C# wird das Schlüsselwort "await" verwendet, um asynchronen Code zu kennzeichnen. Das Schlüsselwort wird normalerweise in Verbindung mit der "async" Kennzeichnung verwendet, um anzuzeigen, dass eine Methode asynchron ist und "await" verwendet wird, um auf das Ergebnis eines asynchronen Tasks zu warten.

internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start LongCalulation");
StartLongCalculation();
Console.WriteLine("Program ended");
Console.ReadLine();
}

static async void StartLongCalculation()
{
int result = await LongCalculationAsync();
Console.WriteLine($"Result is {result}");
}

static Task<int> LongCalculationAsync()
{
Task<int> task = Task.Run<int>(() =>
{
// Simulate a long calculation
Thread.Sleep(5000);
return 1637;
});
return task;
}

Kommentare