Ich implementiere eine Methode Task<Result> StartSomeTask()
und kenne das Ergebnis bereits vor dem Aufruf der Methode. Wie erstelle ich eine Aufgabe <T> , die bereits abgeschlossen ist?
Das mache ich gerade:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Gibt es eine bessere Lösung?
ValueTask
für abgeschlossene Aufgaben gibt (dh für Werte, die Sie bereits haben, sodass der Code im Wesentlichen synchron ist), wodurch Sie eine Zuordnung sparen.Antworten:
quelle
Beim Targeting von .NET 4.5 können Sie Folgendes verwenden
Task.FromResult
:Verwenden Sie zum Erstellen einer fehlgeschlagenen Aufgabe Folgendes
Task.FromException
:.NET 4.6 fügt hinzu,
Task.CompletedTask
wenn Sie eine nicht generische benötigenTask
.Problemumgehungen für ältere Versionen von .NET:
Wenn Sie mit Async Targetting Pack (oder AsyncCTP) auf .NET 4.0 abzielen, können Sie
TaskEx.FromResult
stattdessen verwenden.Um
Task
vor .NET 4.6 nicht generisch zu werden, können Sie die Tatsache verwenden, dieTask<T>
von abgeleitet ist,Task
und einfachTask.FromResult<object>(null)
oder aufrufenTask.FromResult(0)
.quelle
FromException
Methode schreiben , die sich wieFromResult
eine fehlerhafte Aufgabe verhält, aber stattdessen eine fehlerhafte Aufgabe darstellt. Eine solche Methode kann dies einfach für ihre Fehlerfälle zurückgeben, wenn es wichtig ist, dass die Ausnahme in der resultierenden Aufgabe dargestellt wird.Für Aufgaben ohne Rückgabewert hat .NET 4.6 Task.CompletedTask hinzugefügt .
Es gibt eine Aufgabe zurück, die sich bereits in TaskStatus.RanToCompletion befindet. Wahrscheinlich wird jedes Mal dieselbe Instanz zurückgegeben, aber die Dokumentation warnt Sie davor, sich auf diese Tatsache zu verlassen.
quelle
Wenn Sie Rx verwenden, ist Observable.Return (Ergebnis) .ToTask () eine Alternative.
quelle
Wenn Sie Task.WhenAll ohne Parameter aufrufen, wird eine abgeschlossene Aufgabe zurückgegeben.
quelle