Crear una Tarea completada

Estoy implementando un método Task StartSomeTask() y conozco el resultado antes de llamar al método. ¿Cómo creo una tarea que ya se haya completado?

Esto es lo que estoy haciendo actualmente:

 private readonly Result theResult = new Result(); public override Task StartSomeTask() { var task = new Task(() => theResult); task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); return task; } 

¿Hay una mejor solución?

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

Al orientar .NET 4.5, puede usar Task.FromResult :

 public static Task FromResult(TResult result); 

Para crear una tarea fallida, use Task.FromException :

 public static Task FromException(Exception exception); public static Task FromException(Exception exception); 

.NET 4.6 agrega Task.CompletedTask si necesita una Task no genérica.

 public static Task CompletedTask { get; } 

Soluciones provisionales para versiones anteriores de .NET:

  • Al orientar .NET 4.0 con Async Targetting Pack (o AsyncCTP) puede usar TaskEx.FromResult en TaskEx.FromResult lugar.

  • Para obtener Task no genérica antes de .NET 4.6, puede usar el hecho de que la Task deriva de la Task y simplemente llame a Task.FromResult(null) o Task.FromResult(0) .

Para tareas sin valor de retorno, .NET 4.6 ha agregado Task.CompletedTask .

Devuelve una tarea que ya está en TaskStatus.RanToCompletion. Probablemente devuelva la misma instancia cada vez, pero la documentación le advierte que no cuente con ese hecho.

Si está utilizando Rx, una alternativa es Observable.Return (result) .ToTask ().

Tarea de llamada. Cuando todo sin ningún parámetro devolverá una tarea completada.

 Task task = Task.WhenAll();