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?
ValueTask
tareas 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.CompletedTask
si 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.FromResult
en su lugar.Para obtener no genéricos
Task
antes de .NET 4.6, puede utilizar el hecho que seTask<T>
deriva deTask
y simplemente llamarTask.FromResult<object>(null)
oTask.FromResult(0)
.fuente
FromException
método, que se comporta comoFromResult
pero 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