138 votes

Créer une tâche terminée <T>

J'implémente une méthode Task<Result> StartSomeTask() et je connais déjà le résultat avant l'appel de la méthode. Comment créer une tâche <T> qui est déjà terminée?

C'est ce que je suis en train de faire:

 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?

224voto

CodesInChaos Points 60274

Lors du ciblage .NET 4.5, vous pouvez utiliser Task.FromResult:

public static Task<TResult> FromResult<TResult>(TResult result);

Lors du ciblage .NET 4.0 avec Async Cibler Pack (ou AsyncCTP), vous pouvez utiliser TaskEx.FromResult à la place.

Je n'ai pas trouvé un idiomatiques solution pour créer un formulaire de non-générique Task, mais vous pouvez utiliser le fait que l' Task<T> provient Task et il suffit d'appeler Task.FromResult<object>(null) ou Task.FromResult(0).

114voto

QrystaL Points 2606
private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var taskSource = new TaskCompletionSource<Result>();
    taskSource.SetResult(theResult);
    return taskSource.Task;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X