C # – ThreadPool vs Compiti

Come alcuni potrebbero aver visto in .NET 4.0, hanno aggiunto un nuovo spazio dei nomi System.Threading.Tasks che fondamentalmente è ciò che significa, un’attività. L’ho usato solo per alcuni giorni, dall’uso di ThreadPool.

Quale è più efficiente e meno dispendioso in termini di risorse? (O solo meglio nel complesso?)

L’objective dello spazio dei nomi di Tasks è fornire un’architettura collegabile per rendere le applicazioni multi-tasking più facili da scrivere e più flessibili.

L’implementazione utilizza un object TaskScheduler per controllare la gestione delle attività. Questo ha metodi virtuali che puoi sovrascrivere per creare la tua gestione delle attività. I metodi includono per esempio

 protected virtual void QueueTask(Task task) public virtual int MaximumConcurrencyLevel 

Ci sarà un piccolo sovraccarico nell’usare l’implementazione predefinita in quanto c’è un wrapper attorno all’implementazione dei thread .NET, ma non mi aspetto che sia enorme.

Esiste un’implementazione (bozza) di un TaskScheduler personalizzato che implementa più attività su un singolo thread qui .

quale è più efficiente e meno dispendioso in termini di risorse?

Irrilevante, ci sarà davvero poca differenza.

(O solo meglio nel complesso)

La class Task sarà più facile da usare in quanto offre un’interfaccia molto pulita per l’avvio e la partecipazione ai thread e il trasferimento delle eccezioni. Supporta anche una forma (limitata) di bilanciamento del carico.

“A partire da .NET Framework 4, il TPL è il modo preferito per scrivere codice multithreaded e parallelo.”

http://msdn.microsoft.com/en-us/library/dd460717.aspx

La pianificazione è un aspetto importante delle attività parallele.

A differenza dei thread, le nuove attività non iniziano necessariamente ad essere eseguite immediatamente. Invece, sono messi in una coda di lavoro. Le attività vengono eseguite quando il relativo Utilità di pianificazione attività le rimuove dalla coda, in genere quando i nuclei diventano disponibili. L’utilità di pianificazione tenta di ottimizzare il throughput complessivo controllando il grado di concorrenza del sistema. Finché ci sono abbastanza compiti e le attività sono sufficientemente esenti da dipendenze serializzate, le prestazioni del programma si ridimensionano con il numero di core disponibili. In questo modo, i compiti incarnano il concetto di potenziale parallelismo

Come ho visto su msdn http://msdn.microsoft.com/en-us/library/ff963549.aspx

Un altro buon punto da considerare riguardo all’attività è che, quando si utilizza ThreadPool, non si ha alcun modo di interrompere o attendere i thread in esecuzione (a meno che non lo si faccia manualmente nel metodo del thread), ma l’ attività è ansible . Per favore correggimi se sbaglio

Filo

La cosa nuda del metallo, probabilmente non hai bisogno di usarlo, probabilmente puoi usare un LongRunning Task e beneficiare delle sue strutture.

Compiti

Astrazione sopra i fili. Utilizza il pool di thread (a meno che non si specifichi l’operazione come operazione LongRunning , in tal caso, viene creato un nuovo thread sotto il cofano per te).

Pool di thread

Come suggerisce il nome: un pool di fili. Il framework .NET gestisce un numero limitato di thread per te. Perché? Perché aprire 100 thread per eseguire costose operazioni CPU su una CPU con soli 8 core non è sicuramente una buona idea. Il framework manterrà questo pool per te, riutilizzando i thread (non creando / uccidendoli ad ogni operazione) ed eseguendone alcuni in parallelo in modo che la tua CPU non brucerà.

OK, ma quando usarli?

In curriculum: usa sempre le attività.

Il compito è un’abstratione, quindi è molto più facile da usare. Ti consiglio di provare sempre ad usare Task e se incontri qualche problema che ti rende necessario gestire un thread da solo (probabilmente l’1% delle volte), quindi utilizzare i thread.

MA sii consapevole che:

  • Limite I / O : per operazioni con I / O (chiamate database, lettura / scrittura file, chiamate API, ecc.) Non utilizzare mai le normali attività , utilizzare LongRunning attività LongRunning oi thread se necessario, ma non le normali attività. Perché ti condurrebbe a un pool di thread con alcuni thread occupati e molte altre attività che attendono il turno per prendere il pool.
  • Limite della CPU : per le operazioni legate alla CPU basta usare le normali attività ed essere felici.