Oggi stavo scavando con TPL e ho trovato una nuova classe Task.Ora volevo solo sapere che cos'è la diffrenza tra task e Thread e qual è la migliore?Qual è la differenza tra Task e Thread?
risposta
cos'è la diffrenza tra un'attività e una discussione?
Supponiamo che stiate gestendo una società di consegna di libri. Hai quattro macchine e quattro piloti. Una macchina è un thread, un driver è un processore e una consegna di libri è un'attività. Il problema che devi affrontare è come pianificare in modo efficiente i conducenti e le auto in modo che le attività vengano eseguite il più rapidamente possibile.
Dove le cose si fanno strano è quando ci sono più automobili (discussioni) che driver (processori). Quello che succede allora è a metà del viaggio in cui il guidatore parcheggia una macchina (sospende il filo) e entra in una macchina diversa (cambia contesto), ne fa girare un po 'per un po' di tempo e poi torna alla prima macchina. Ovviamente non è così efficiente come un autista che sta in una macchina.
L'idea di parallism task-based è quello di spezzare il lavoro in piccoli compiti che può produrre risultati in futuro, e quindi allocare in modo efficiente esattamente come tanti fili come ci sono processori in modo che non si commutazione contesto tempo di scarto. In pratica, di solito non funziona bene, ma questa è l'idea.
quale è meglio, attività o thread?
La domanda non può essere risolta perché non ha alcun senso. Quale è meglio, un libro da consegnare a un cliente o un'automobile per consegnarlo? Una macchina è un dispositivo che può essere utilizzato per consegnare un libro; queste due cose non sono cose che puoi sensibilmente descrivere come "migliori" o "peggio" rispetto alle altre. È come chiedere "quale è meglio, un buco o un trapano?"
Qui sono alcune differenze:
Task
di default utilizza piscina filo mentre utilizzando direttamenteThread
richiederà la creazione di nuovo thread.Task
gestirà le eccezioni e i risultati in modo da semplificare l'utilizzo.Task
in grado di supportare la cancellazione durante l'utilizzo di thread, è necessario implementarlo da soli.
L'attività non utilizza necessariamente il ThreadPool. Questo è l'impostazione predefinita (in .NET 4), ma non sempre è true. –
@Reed Grazie. Quali sono le eccezioni? Come può essere superato? Ti dispiace indicarmi un riferimento per favore. – Aliostad
Spetta al TaskScheduler decidere dove e come eseguire un'attività. Lo schduler predefinito usa il ThreadPool (a meno che non sia impostato l'hint LongRunning, nel qual caso l'Task riceve un thread dedicato), ma uno schedulatore può fare tutto ciò che vuole. Inoltre, le continuazioni spesso vengono eseguite con uno scheduler basato sul SynchronizationContext corrente. Ho scritto sulla programmazione qui: http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/ –
Un "compito" è un lavoro che verrà eseguito e completato in un determinato momento nel futuro.
Un "thread" è come qualcosa viene eseguita.
In genere, quando si crea un'attività, per impostazione predefinita (es: usando Task.Factory.StartNew
), il Task
otterrà pianificata a correre su un filo ThreadPool ad un certo punto. Tuttavia, questo non è sempre vero.
il vantaggio di rendere questa separazione è che si consente al quadro (o voi stessi, se si utilizza un personalizzato TaskScheduler
) per controllare come il tuo lavoro viene mappato sul thread disponibili. In genere, avrai molti più oggetti di lavoro che discussioni: potresti avere un milione di elementi da elaborare, ma solo 8 core nel tuo sistema. In una situazione come questa, è molto più efficiente utilizzare un numero fisso di thread e ogni thread elabora più elementi di lavoro. Separando "Task" da "Thread", si interrompe questo accoppiamento di lavoro == thread.
In generale, si consiglia di utilizzare Task
anziché creare i propri thread. Questo è un modello molto più bello, più potente e flessibile da utilizzare per lo sviluppo, soprattutto perché consente di gestire eccezioni in modo molto pulito, consente di generare cose gradevoli come continuazioni, ecc.
Secondo lo MSDN reference documentation :
la Task Parallel Library (TPL) è un insieme di tipi pubblici e le API nelle System.Threading e System.Threading.Tasks spazi dei nomi nella versione di .NET Framework 4. lo scopo del TPL è quello di rendere gli sviluppatori sono più produttivi semplificando il processo di aggiunta del parallelismo e della concorrenza alle applicazioni. Il TPL scala dinamicamente il grado di concorrenza per utilizzare in modo più efficiente tutti i processori disponibili. Inoltre, il TPL gestisce il partizionamento del lavoro, la pianificazione dei thread sul ThreadPool, il supporto per la cancellazione, la gestione dello stato e altri dettagli di basso livello. Utilizzando TPL, puoi massimizzare le prestazioni del tuo codice concentrandoti sul lavoro che il tuo programma è progettato per realizzare.
Così sembra che una Task è il mezzo preferito di codifica un'operazione asincrona, come gran parte del lavoro è curata dal quadro. D'altra parte, Thread è ancora disponibile per il codice esistente e per i casi in cui si desidera esplicitamente allocare e gestire un thread del sistema operativo.
A L'attività indica un'azione o un'attività che si desidera eseguire.
A Il thread può essere uno dei risultati del lavoro o del lavoratore che funziona.
- 1. Differenza tra Task (System.Threading.Task) e Thread
- 2. Qual è la differenza tra Task e IO in Scalaz?
- 3. Qual è la differenza tra loop.create_task, asyncio.async/ensure_future e Task?
- 4. Qual è la differenza tra handle e thread?
- 5. Qual è la differenza tra thread-aware e thread-safe?
- 6. Qual è la differenza tra processo leggero e thread?
- 7. Qual è la differenza tra Worker e Thread in Puma
- 8. Qual è la differenza tra l'utilizzo solo di asynс Task e Task?
- 9. Perché tanta differenza di prestazioni tra Thread e Task?
- 10. Qual è la differenza tra = e: =
- 11. Qual è la differenza tra Verilog! e ~?
- 12. Qual è la differenza tra? : e ||
- 13. qual è la differenza tra [[], []] e [[]] * 2
- 14. Qual è la differenza tra $ e $$?
- 15. Qual è la differenza tra ("") e (null)
- 16. Qual è la differenza tra dict() e {}?
- 17. Qual è la differenza tra " " e ""?
- 18. Qual è la differenza tra {0} e ""?
- 19. Qual è la differenza tra `##` e `hashCode`?
- 20. Qual è la differenza tra {0} e +?
- 21. Qual è la differenza tra .ToString() e + ""
- 22. qual è la differenza tra:.! e: r !?
- 23. Qual è la differenza tra la serratura e RLock
- 24. Stack attività e attività: qual è la differenza tra entrambi.
- 25. qual è la differenza tra pool di thread di Windows e pool di thread CLR
- 26. Qual è la differenza tra il thread di Dispatcher e il thread dell'interfaccia utente
- 27. Qual è la differenza tra il thread multithreading e pthread o thread Java?
- 28. Qual è la differenza tra un thread Worker CLR e un thread Worker?
- 29. Qual è la differenza tra "Thread.currentThread(). GetName" e "this.getName"?
- 30. Qual è la differenza tra Task.Run() e Task.Factory.StartNew()
Grazie per il chiarimento – santosh
'quale è meglio, compito o thread?' Credo OP intendesse usare la classe 'Thread' invece di usare' Task 'e non il thread stesso. –
Aliostad
grande analogia. non ho visto questo spiegato in modo così chiaro prima di –