8

Ho un'applicazione in C# con un elenco di lavoro da fare. Sto cercando di fare più lavoro possibile in parallelo. Tuttavia, devo essere in grado di controllare la quantità massima di attività parallele.Tasks vs ThreadPool

Da quello che ho capito, questo è possibile con un ThreadPool o con Task. C'è una differenza in quale uso? La mia preoccupazione principale è riuscire a controllare quanti thread sono attivi contemporaneamente.

+0

Sei assolutamente sicuro di dover controllare la quantità di thread in esecuzione? O semplicemente è necessario controllare il numero di pezzi di lavoro in corso? – Gusdor

risposta

19

prega di dare un'occhiata al ParallelOptions.MaxDegreeOfParallelism per Task s.

Ti consiglierei di utilizzare Attività, poiché forniscono un'astrazione di livello superiore rispetto al ThreadPool.

Un'ottima lettura sull'argomento può essere trovata here. Davvero un libro imperdibile ed è gratuito in più :)

2

È anche possibile creare un semaforo per controllare quanti thread possono essere eseguiti in una sola volta. È possibile creare un nuovo semaforo e nel costruttore specificare quanti thread simultanei sono in grado di utilizzare quel semaforo in una sola volta. Dato che non so come userete i thread, questo sarebbe un buon punto di partenza.

MSDN Article on the Semaphore class

-Wesley

3

In questo article on msdn, spiegano perché raccomandano Attività anziché ThreadPool per Parallelismo.

2

L'attività ha una funzione molto affascinante per me, è possibile creare catene di attività. Che vengono eseguiti su determinati risultati del compito prima. Una funzione che uso spesso sta seguendo: L'attività A è in esecuzione in background per eseguire alcuni lavori a lungo termine. Eseguo l'attività B dopo l'operazione, eseguendo solo quando l'attività A ha terminato regolarmente e configurandola per l'esecuzione in primo piano, così posso aggiornare facilmente i miei controlli con il risultato dell'attività a lungo Task A.

5

In TPL è possibile utilizzare il WithDegreeOfParallelism su un ParallelEnumerable o ParallelOptions.MaxDegreeOfParallism

V'è anche il CountdownEvent che può essere una scelta migliore se si sta solo usando le discussioni personalizzati o compiti.

Nel ThreadPool, quando si utilizza SetMaxThreads globale per il AppDomain in modo che si possa potenzialmente limitare il codice non correlato inutilmente.

Non è possibile impostare il numero di thread di lavoro o il numero di thread di completamento I/O su un numero inferiore al numero di processori nel computer.

Se il runtime in linguaggio comune è ospitato, ad esempio da Internet Information Services (IIS) o SQL Server, l'host può limitare o impedire le modifiche alle dimensioni del pool di thread.

Prestare attenzione quando si modifica il numero massimo di thread nel pool di thread. Sebbene il tuo codice possa essere di beneficio, le modifiche potrebbero avere un effetto negativo sulle librerie di codici che utilizzi.

L'impostazione della dimensione del pool di thread troppo grande può causare problemi di prestazioni. Se vengono eseguiti troppi thread contemporaneamente, l'overhead del task diventa un fattore significativo.

Sono d'accordo con l'altra risposta che si dovrebbe usare il TPL ThreadPool come una migliore estrazione di multi-threading, ma il suo possibile realizzare ciò che si desidera in entrambi.