2012-12-31 13 views
23

Quando dovrei usare async/await e quando dovrei usare parallel.foreach in C#? Sono paralleli e asincroni/attendono lo stesso scopo? Quali sono le differenze in loro?Async/await e parallel in C#

+0

Vedere questa domanda correlata: http://stackoverflow.com/questions/9898441/do-the-new-c-sharp-5-0-async-and-await-keywords-use -multiple-core –

+0

Vedere come chiamare le operazioni asincrone in parallelo https://stackoverflow.com/questions/11564506/nesting-await-in-parallel-foreach/11565531#11565531 –

risposta

72

asincrona/attendono circa asincronia, mentre Parallel.ForEach è di circa parallelismo. Sono concetti correlati, ma non uguali.

Parallel.ForEach viene utilizzato quando si desidera eseguire la stessa operazione su tutti gli elementi di una raccolta, in parallelo, bloccando il thread corrente fino al completamento di tutte le operazioni.

async/await viene utilizzato quando l'operazione corrente non può effettuare ulteriori progressi finché non è stata completata una particolare operazione asincrona, ma non si desidera bloccare il thread corrente. Questo è particolarmente utile in due situazioni:

  • codice di scrittura che prende fondamentalmente fuori varie operazioni asincrone, uno dopo l'altro, nel thread UI, accedendo brevemente l'interfaccia utente tra le operazioni. (È più generale di quello, ma questo è un semplice esempio.) Non vuoi bloccare il thread dell'interfaccia utente, ma gestire tutte quelle operazioni asincrone è un altro dolore.
  • Gestione lotti di operazioni di lunga durata alla volta, ad es. in un server web. Ogni singola richiesta può richiedere molto tempo a causa della chiamata ad altri servizi Web, database, ecc., Ma non si desidera avere un thread per richiesta, poiché i thread sono una risorsa relativamente costosa.

È possibile combinare il parallelismo e asincronia dando il via ad un nuovo compito che chiamerà Parallel.ForEach, e quindi in attesa di questo compito. (Proprio come un esempio.)

Problemi correlati