2014-04-20 14 views
6

Sto cercando di ottenere una buona conoscenza asincrona/attesa e voglio cancellare parte della confusione. Qualcuno può spiegare quale sarebbe la differenza in termini di esecuzione per la seguente:Async/Await Differenza di esecuzione

// version 1 
public Task Copy(string source, string destination) { 
    return Task.Run(() => File.Copy(source, destination)); 
} 

public async Task Test() { 
    await Copy("test", "test2");  
    // do other stuff 
} 

E:

// version 2 
public async Task Copy(string source, string destination) { 
    await Task.Run(() => File.Copy(source, destination)); 
} 

public async Task Test() { 
    await Copy("test", "test2"); 
    // ... 
} 

stanno causando lo stesso codice e per questo vorrei scrivere uno sopra l'altro?

+1

Forse un duplicato: http://stackoverflow.com/q/21033150/1768303 – Noseratio

+1

@Noseratio Sì, è vero, anche la risposta di Erics è un "apri gli occhi", mi dispiace per il dup, non ho trovato nulla (non proprio sicuro come formulare la ricerca: P) –

+2

@DimitarDimitrov, IMO, oltre al sovraccarico della macchina di stato, la differenza principale è la [logica di propagazione delle eccezioni] (http://stackoverflow.com/a/21082631/1768303) . – Noseratio

risposta

8

Innanzitutto vorrei iniziare con il punto che entrambi i codici sono non stesso.

Il codice versione1 creerà solo un "computer di stato" in quanto contiene solo il metodo Test.

Il codice versione2 creerà due "macchine di stato" per il metodo Copy e Test che aggiunge un sovraccarico.

Perché utilizziamo i metodi async? Semplice solo per rendere leggibile il nostro codice, elegante mentre si tratta di "Task asincroni". Si rende il nostro codice migliore evitando callback e continuazioni ecc

Analizziamo cosa Copy metodo sta facendo e noi rispondere alla domanda se abbiamo davvero bisogno di essere async?

Copy metodo semplicemente delegati la chiamata al Task.Run che restituisce un compito che alla fine raggiunge il completamento al termine File.Copy s'. Quindi l'intento è chiaro qui abbiamo bisogno di un compito che notifica il completamento File.Copy. Questo metodo fa tutto ciò di cui hai bisogno, senza che sia necessario che async funzioni come previsto.

Quindi, quando è necessario async?

È necessario async quando è necessario eseguire del codice al completamento dell'attività precedente (Continuazione).

Esempio:

public async Task Test() 
{ 
    await Copy("test", "test2"); 
    DoPostCopied(whatever); 
    await DoPostCopied2();//Etc 
} 

È possibile verificare questa differenza tra async e il metodo non asincrone semplicemente decompilazione entrambe le versioni. È troppo lungo e non sarà leggibile, quindi l'ho saltato pubblicandolo qui.

Conclusione: utilizzare async solo se richiesto . In questo caso version1 è migliore e dovresti preferirlo a version2.

+0

+1 per aver sottolineato che non sono gli stessi –

+1

@AmitJoki Suppongo che dobbiamo dare +1 per op anche per la domanda interessante –

+0

fatta. Effettivamente era una bella domanda –

Problemi correlati