Estoy implementando un método Task<Result> StartSomeTask()y ya sé el resultado antes de que se llame al método. ¿Cómo creo una Tarea <T> que ya se ha completado?
Esto es lo que estoy haciendo actualmente:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
¿Hay una mejor solución?

ValueTasktareas completadas (es decir, valores que ya tiene para que el código sea esencialmente sincrónico), lo que le ahorrará una asignación.Respuestas:
fuente
Al apuntar a .NET 4.5 puede usar
Task.FromResult:Para crear una tarea fallida, use
Task.FromException:.NET 4.6 agrega
Task.CompletedTasksi necesita un no genéricoTask.Soluciones para versiones anteriores de .NET:
Cuando apunte a .NET 4.0 con Async Targetting Pack (o AsyncCTP), puede usar
TaskEx.FromResulten su lugar.Para obtener no genéricos
Taskantes de .NET 4.6, puede utilizar el hecho que seTask<T>deriva deTasky simplemente llamarTask.FromResult<object>(null)oTask.FromResult(0).fuente
FromExceptionmétodo, que se comporta comoFromResultpero representa una tarea defectuosa. Tal método puede simplemente devolverlo para sus casos de error si es importante que la excepción se represente en la tarea resultante.Para tareas sin valor de retorno, .NET 4.6 ha agregado Task.CompletedTask .
Devuelve una tarea que ya está en TaskStatus.RanToCompletion. Probablemente devuelve la misma instancia cada vez, pero la documentación le advierte que no cuente con ese hecho.
fuente
Si está utilizando Rx, una alternativa es Observable.Return (resultado) .ToTask ().
fuente
Llamar a Task.WhenAll sin ningún parámetro devolverá una tarea completada.
fuente