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.
fonte
2014-04-20 11:21:56
Forse un duplicato: http://stackoverflow.com/q/21033150/1768303 – Noseratio
@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) –
@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