Implementuję metodę Task<Result> StartSomeTask()
i tak się składa, że znam wynik jeszcze przed wywołaniem metody. Jak utworzyć zadanie <T>, które zostało już zakończone?
Oto, co obecnie robię:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Czy jest lepsze rozwiązanie?
ValueTask
dla ukończonych zadań (tj. Dla wartości, które już masz, więc kod jest zasadniczo synchroniczny), co pozwoli Ci zaoszczędzić przydział.Odpowiedzi:
źródło
W przypadku platformy .NET 4.5 można użyć
Task.FromResult
:Aby utworzyć zadanie, które się nie powiodło, użyj
Task.FromException
:NET 4.6 dodaje,
Task.CompletedTask
jeśli potrzebujesz niestandardowegoTask
.Obejścia dla starszych wersji platformy .NET:
W przypadku platformy .NET 4.0 z pakietem Async Targetting Pack (lub AsyncCTP) można użyć
TaskEx.FromResult
zamiast tego.Aby uzyskać nieogólną wersję
Task
przed .NET 4.6, możesz użyć faktu, któryTask<T>
pochodzi zTask
i po prostu wywołaćTask.FromResult<object>(null)
lubTask.FromResult(0)
.źródło
FromException
metodę, która zachowuje się jakFromResult
zadanie, ale zamiast tego przedstawia błędne zadanie. Taka metoda może po prostu zwrócić to dla swoich przypadków błędów, jeśli ważne jest, aby wyjątek był reprezentowany w wynikowym zadaniu.W przypadku zadań bez wartości zwracanej .NET 4.6 dodał Task.CompletedTask .
Zwraca zadanie, które jest już w TaskStatus.RanToCompletion. Prawdopodobnie za każdym razem zwraca tę samą instancję, ale dokumentacja ostrzega, aby nie liczyć na ten fakt.
źródło
Jeśli używasz Rx, alternatywą jest Observable.Return (result) .ToTask ().
źródło
Wywołanie Task.WhenAll bez parametrów zwróci ukończone zadanie.
źródło