Estou implementando um método Task<Result> StartSomeTask()
e já sei o resultado antes que o método seja chamado. Como crio uma tarefa <T> que já foi concluída?
Isto é o que estou fazendo atualmente:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Existe uma solução melhor?
ValueTask
tarefas concluídas (ou seja, valores que você já possui para que o código seja essencialmente síncrono), o que salvará uma alocação.Respostas:
fonte
Ao direcionar o .NET 4.5, você pode usar
Task.FromResult
:Para criar uma tarefa com falha, use
Task.FromException
:O .NET 4.6 adiciona
Task.CompletedTask
se você precisar de um não genéricoTask
.Soluções alternativas para versões mais antigas do .NET:
Ao direcionar o .NET 4.0 com o Async Targetting Pack (ou AsyncCTP), você pode usá-lo
TaskEx.FromResult
.Para ficar não genérico
Task
antes do .NET 4.6, você pode usar o fato de queTask<T>
derivaTask
e apenas chamarTask.FromResult<object>(null)
orTask.FromResult(0)
.fonte
FromException
método, que se comporta como,FromResult
mas representa uma tarefa com falha. Esse método pode simplesmente retornar isso para seus casos de erro, se for importante que a exceção seja representada na tarefa resultante.Para tarefas sem valor de retorno, o .NET 4.6 adicionou Task.CompletedTask .
Ele retorna uma tarefa que já está em TaskStatus.RanToCompletion. Provavelmente, sempre retorna a mesma instância, mas a documentação avisa para você não contar com esse fato.
fonte
Se você estiver usando o Rx, uma alternativa é Observable.Return (result) .ToTask ().
fonte
Chamar Task.WhenAll sem nenhum parâmetro retornará uma tarefa concluída.
fonte