Creare una task completato
-
27-09-2019 - |
Domanda
Sto implementando un metodo Task<Result> StartSomeTask()
e capita di conoscere il risultato già prima che il metodo viene chiamato. Come faccio a creare una Task
Questo è quello che sto facendo attualmente:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
C'è una soluzione migliore?
Soluzione
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var taskSource = new TaskCompletionSource<Result>();
taskSource.SetResult(theResult);
return taskSource.Task;
}
Altri suggerimenti
Quando il targeting .NET 4.5 è possibile utilizzare Task.FromResult
:
public static Task<TResult> FromResult<TResult>(TResult result);
Per creare un'attività fallita, utilizzare Task.FromException
:
public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);
Task.CompletedTask
se avete bisogno di un Task
non generico.
public static Task CompletedTask { get; }
Soluzioni alternative per le vecchie versioni di .NET:
-
Quando ci si rivolge .NET 4.0 con Async destinati a pacchetto (o AsyncCTP) è possibile utilizzare
TaskEx.FromResult
posto. -
Per ottenere
Task
non generico prima di .NET 4.6, è possibile utilizzare il fatto che deriva daTask<T>
Task
e soloTask.FromResult<object>(null)
chiamata oTask.FromResult(0)
.
Per le attività senza valore di ritorno, .NET 4.6 ha aggiunto Task .CompletedTask .
Si restituisce un compito che è già in TaskStatus.RanToCompletion. Probabilmente restituisce la stessa istanza ogni volta, ma la documentazione che si avverte di non contare su questo fatto.
Se stai usando Rx, un'alternativa è Observable.Return (risultato) .ToTask ().
La chiamata Task.WhenAll senza parametri restituirà un'attività completata.
Task task = Task.WhenAll();