2013-03-01 18 views
68

In .Net 4.5 Microsoft ha aggiunto la nuova funzione Async/Await per semplificare la codifica asincrona. Tuttavia, mi chiedoAsync/Await vs Thread

  1. Può Async/Await sostituire completamente il vecchio modo di usare Threads?
  2. È Async/Await in grado di fare tutto ciò che a Thread può fare in modo asincrono?
  3. È possibile utilizzare solo Async/Await con alcuni metodi come WebClient.DownloadStringAsync oppure è possibile convertire qualsiasi metodo sincrono per utilizzare Async/Await e non per bloccare il thread principale?
+2

Thread e Async/Attendi sono funzioni non correlate. Puoi combinarli, ma non devi. – dtb

+1

Ho pensato che Async/Await stia facendo la stessa cosa di 'new Thread (() => {Some Work}). Start();' sta facendo?! non è vero? –

+1

No. La tua ipotesi non è corretta. Si potrebbe pensare a [Task.Run] (http://msdn.microsoft.com/en-us/library/hh195051.aspx) (TPL), che spesso è combinato con Async/Attesa, ma è anche non correlato e non non deve essere usato con esso. – dtb

risposta

50

può sostituire completamente il vecchio modo di utilizzare i thread?

No. Un thread può fare molte altre cose utili. Await è specificamente progettato per gestire qualcosa che richiede tempo, in genere una richiesta di I/O. Che tradizionalmente era fatto con un callback quando la richiesta di I/O era completa. Scrivere codice che si basa su questi callback è abbastanza difficile, attenderlo notevolmente lo semplifica.

in grado di fare ciò che una Thread può mai fare in modo asincrono?

Approssimativo. Attendere si occupa solo di gestire il ritardo, altrimenti non fa nulla che un thread faccia. L'attesa espressione, ciò che è a destra della parola chiave Attendere, è ciò che ottiene il lavoro svolto. Idealmente non usa affatto un thread, pubblica una richiesta di driver e una volta che il driver ha completato il trasferimento dei dati, genera un callback di notifica di completamento. Il networking è di gran lunga l'uso più comune, le latenze di centinaia di millisecondi sono comuni e un inevitabile effetto collaterale dei servizi che si spostano dal desktop o da una LAN verso il "cloud". L'utilizzo di tali servizi in modo sincrono renderebbe un'interfaccia utente abbastanza insensibile.

solo può essere utilizzato con alcuni metodi come WebClient.DownloadStringAsync

No. Si può utilizzare con qualsiasi metodo che restituisce un Task. I metodi XxxxAsync() sono solo precotti nel framework .NET per operazioni comuni che richiedono tempo. Come scaricare dati da un server web.

+4

Nel moderno aspetto C# qual è l'approccio migliore per ottenere callback asincroni su API esterne? – bonCodigo

+4

Coperto nell'ultimo paragrafo, utilizzare un'attività. –

+0

Mi aspetto qualcosa che un thread può fare che non può essere fatto tramite la programmazione asincrona come esempio. –

12

The official statement on this. Anche se dovresti capire le differenze tra i thread e la programmazione asincrona, prima di sostituire ciecamente una cosa con gli altri.

+0

Questo è come la prima risorsa che ho letto su Thread e Async/Attesa che è chiara e concisa. –

+0

Questa risposta contiene solo un collegamento alla documentazione. Dal momento che il link potrebbe diventare obsoleto, la risposta potrebbe diventare obsoleta o, peggio ancora, completamente inutile. Incoraggiamo gli utenti di Stack a pubblicare le parti rilevanti dei link direttamente nella loro domanda. – HimBromBeere