2014-12-03 8 views
25

Sono nuovo a TPL e mi chiedo: in che modo il supporto di programmazione asincrono che è nuovo a C# 5.0 (tramite le nuove parole chiave async e await riguarda la creazione di thread?L'uso di async/await crea un nuovo thread?

In particolare, l'utilizzo di async/await crea un nuovo thread ogni volta che vengono utilizzati? E se ci sono molti metodi nidificati che usano async/await, è un nuovo thread creato per ciascuno di questi metodi?

+4

Dipende da come viene implementato il metodo con cui si chiama 'await'. Dovresti leggere http://blog.stephencleary.com/2013/11/there-is-no-thread.html Ma attenzione. * Ci immergeremo in profondità. * – MarcinJuraszek

+0

No, per esempio vedi http://stackoverflow.com/a/27071434/876814 –

risposta

33

In breve NO

Da Asynchronous Programming with Async and Await : Threads

L'asincrono e attendono parole chiave non causano fili addizionali da creati. I metodi asincroni non richiedono il multithreading perché un metodo asincrono non viene eseguito su una propria discussione. Il metodo viene eseguito nel contesto di sincronizzazione corrente e utilizza il tempo sul thread solo quando il metodo è attivo. È possibile utilizzare Task.Run per spostare il lavoro collegato alla CPU a un thread di sfondo , ma un thread in background non è d'aiuto con un processo che attende solo che i risultati siano disponibili.

+1

Non importa quante volte guardo a questo problema, non riesco ancora a capire. "I metodi asincroni non richiedono il multithreading perché un metodo asincrono non viene eseguito sul proprio thread" Ergo -> un altro thread. Come può essere altrimenti? – dudeNumber4

+2

Non tutte le operazioni richiedono un thread. Ci sono molti processori/controller su un sistema tipico inclusi controller del disco, controller di schede di rete, GPU ecc. Devono solo ricevere un comando da un processore. Quindi procedono ad eseguire il comando e informano il processore al termine (notificarlo interrompendolo o qualche altro meccanismo). Fino ad allora, non è coinvolto alcun thread. Il thread di emissione può andare in sleep o andare in un pool di thread in cui può essere riutilizzato. Al termine del comando, l'esecuzione del programma può essere continuata dal thread in sospensione o da un thread del pool di thread. – Vakho

+0

what if async/await method è un metodo associato a cpu Task.Run viene utilizzato per elaborare il processo a lunga esecuzione in quel caso asycn con richiedere il nuovo thread, no? –

Problemi correlati