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 che ha già completato?

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?

È stato utile?

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 da Task<T> Task e solo Task.FromResult<object>(null) chiamata o Task.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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top