J'implémente une méthode Task<Result> StartSomeTask()
et je connais déjà le résultat avant que la méthode ne soit appelée. Comment créer une tâche <T> déjà terminée?
C'est ce que je fais actuellement:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Y a-t-il une meilleure solution?
ValueTask
pour les tâches terminées (c'est-à-dire pour les valeurs que vous avez déjà pour que le code soit essentiellement synchrone), ce qui vous fera économiser une allocation.Réponses:
la source
Lorsque vous ciblez .NET 4.5, vous pouvez utiliser
Task.FromResult
:Pour créer une tâche ayant échoué, utilisez
Task.FromException
:.NET 4.6 ajoute
Task.CompletedTask
si vous avez besoin d'un fichierTask
.Solutions de contournement pour les anciennes versions de .NET:
Lorsque vous ciblez .NET 4.0 avec Async Targetting Pack (ou AsyncCTP), vous pouvez utiliser à la
TaskEx.FromResult
place.Pour obtenir des versions non génériques
Task
antérieures à .NET 4.6, vous pouvez utiliser le fait quiTask<T>
dérive deTask
et appelez simplementTask.FromResult<object>(null)
ouTask.FromResult(0)
.la source
FromException
méthode, qui se comporte commeFromResult
mais représente à la place une tâche défectueuse. Une telle méthode peut simplement renvoyer cela pour ses cas d'erreur s'il est important que l'exception soit représentée dans la tâche résultante.Pour les tâches sans valeur de retour, .NET 4.6 a ajouté Task. .
Il renvoie une tâche qui est déjà dans TaskStatus.RanToCompletion. Il renvoie probablement la même instance à chaque fois, mais la documentation vous avertit de ne pas compter sur ce fait.
la source
Si vous utilisez Rx, une alternative est Observable.Return (result) .ToTask ().
la source
L'appel de Task.WhenAll sans aucun paramètre renverra une tâche terminée.
la source