run programming parallel net examples example asp c# .net task-parallel-library

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 en TaskEx.FromResult lugar.

  • Para obtener Task no genérica antes de .NET 4.6, puede usar el hecho de que la Task<T> deriva de la Task y simplemente llame a Task.FromResult<object>(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();


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