programming - task.run c#
Crear una Tarea completada<T> (5)
Estoy implementando un método Task<Result> StartSomeTask()
y conozco el resultado antes de llamar al método. ¿Cómo creo una Task<T> que ya se haya 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?
Al orientar .NET 4.5, puede usar Task.FromResult
:
public static Task<TResult> FromResult<TResult>(TResult result);
Para crear una tarea fallida, use Task.FromException
:
public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(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
enTaskEx.FromResult
lugar.Para obtener
Task
no genérica antes de .NET 4.6, puede usar el hecho de que laTask<T>
deriva de laTask
y simplemente llame aTask.FromResult<object>(null)
oTask.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();
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var taskSource = new TaskCompletionSource<Result>();
taskSource.SetResult(theResult);
return taskSource.Task;
}