Pregunta

estoy poniendo en práctica un método y Task<Result> StartSomeTask() pasar a conocer el resultado ya antes de llamar al método. ¿Cómo se crea una Tarea que ya 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 solución mejor?

¿Fue útil?

Solución

private readonly Result theResult = new Result();

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

Otros consejos

Cuando el objetivo es .NET 4.5 se puede utilizar Task.FromResult :

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

Para crear una tarea fallida, usar Task.FromException :

public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);

Task.CompletedTask si necesita un Task no genérico.

public static Task CompletedTask { get; }

Soluciones provisionales para las versiones anteriores de .NET:

  • Cuando el objetivo es .NET 4.0 con asíncrono Targetting Pack (o AsyncCTP) se puede utilizar en lugar TaskEx.FromResult.

  • Para obtener Task no genérica antes que .NET 4.6, se puede utilizar el hecho de que se deriva de Task<T> Task y simplemente Task.FromResult<object>(null) llamada o Task.FromResult(0).

Para las tareas sin valor de retorno, .NET 4.6 ha añadido de tareas .CompletedTask .

Se vuelve una tarea que ya está en TaskStatus.RanToCompletion. Es probable que devuelve la misma instancia cada vez, pero la documentación que advierte que no contar con ese hecho.

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

Llamando Task.WhenAll sin ningún parámetro volverá una tarea completada.

Task task = Task.WhenAll();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top