2011-04-11 17 views

risposta

57

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?"

+0

Grazie per il chiarimento – santosh

+4

'quale è meglio, compito o thread?' Credo OP intendesse usare la classe 'Thread' invece di usare' Task 'e non il thread stesso. – Aliostad

+6

grande analogia. non ho visto questo spiegato in modo così chiaro prima di –

6

Qui sono alcune differenze:

  • Taskdi default utilizza piscina filo mentre utilizzando direttamente Thread 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.
+0

L'attività non utilizza necessariamente il ThreadPool. Questo è l'impostazione predefinita (in .NET 4), ma non sempre è true. –

+1

@Reed Grazie. Quali sono le eccezioni? Come può essere superato? Ti dispiace indicarmi un riferimento per favore. – Aliostad

+2

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/ –

17

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.

4

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.

5

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.

Problemi correlati