2016-04-22 20 views
14

Mi chiedevo quale sia il modo migliore/corretto di scrivere codice asincrono composto da due (o più) operazioni asincrone e dipendenti (le prime devono terminare per eseguire secondi).Attesa sequenziale VS Continuazione in attesa

Esempio con async/attendono:

await RunFirstOperationAsync(); 
await RunSecondOperationAsync(); 

Esempio con Continua:

await RunFirstOperationAsync() 
    .ContinueWith(t => RunSecondOperationAsync()); 
+2

Guarda [questo] (http://stackoverflow.com/questions/8767218/is-async-await-keyword-equivalent-to-a-continuewith-lambda) SO discussione –

risposta

15

Che ci si vuole utilizzare await se è possibile.

ContinueWith ha un numero di problemi. Lo descrivo brevemente nel mio post sul blog why ContinueWith is dangerous, che si basa sul mio precedente post sul blog why StartNew is dangerous (condividono molti degli stessi problemi).

In particolare:

  • ContinueWith non hanno un buon valore predefinito TaskScheduler. L'Utilità di pianificazione predefinita è TaskScheduler.Current (non TaskScheduler.Default) e la ripresa sull'attuale SynchronizationContext deve essere eseguita manualmente, se lo si desidera.
  • ContinueWith ha un valore non predefinito options. Per il codice asincrono, si desidera DenyChildAttach e ExecuteSynchronously, almeno.
  • ContinueWith non comprende le continuazioni asincrone, che in genere richiedono una chiamata aggiuntiva Unwrap per aggirare questa limitazione.
  • ContinueWith tratta l'argomento CancellationToken in modo sorprendente. Altro su quello in this blog post mio.

Questi argomenti sono tutti riassunti sul mio blog post on Task continuations. await non ha nessuno di questi inconvenienti.