2011-08-25 7 views
12

Sto usando Parallel.Foreach per popolare una ConcurrentBag esterna. Ho provato anche a usare una lista comune e tutto funziona bene.Quando una ConcurrentBag è migliore di una lista?

Sono stato fortunato o mi sono perso lo scopo speciale di ConcurrentBag?

+0

il numero di core/CPU La vostra macchina di sviluppo hanno? – ChaosPandion

+0

Due processori. – abx78

risposta

18

Sei stato fortunato; Parallel.ForEach per popolare un elenco non è thread-safe, si verificherà eventualmente problemi.

Secondo MSDN, List<T> non è thread-safe:

I membri di istanza non sono garantiti come thread safe.

Una lista <T> può supportare più lettori contemporaneamente, a condizione che la raccolta non venga modificata. L'enumerazione tramite una raccolta è intrinsecamente non una procedura thread-safe. Nel raro caso in cui un'enumerazione contenda con uno o più accessi in scrittura, l'unico modo per garantire la sicurezza del thread consiste nel bloccare la raccolta durante l'intera enumerazione . Per consentire l'accesso alla raccolta da più thread per la lettura e la scrittura, è necessario implementare la propria sincronizzazione .

ConcurrentBag è ciò che è necessario utilizzare per questo, che è thread-safe per più lettori e scrittori.

+0

Grazie per chiarire questo! – abx78

+0

Sei il benvenuto. Si prega di contrassegnare una delle risposte come accettate. Grazie! –

5

Se si utilizza Parallel.ForEach per popolare uno List<T> e tutto funziona perfettamente, allora si sta semplicemente diventando fortunati. Il metodo ForEach può eseguire ed eseguirà il codice su più thread in modo che qualsiasi comunicazione esterna allo ForEach debba essere con oggetti in grado di gestire aggiornamenti simultanei. List<T> can not but ConcurrentBag<T> can.

+0

Entrambe le domande erano buone, grazie! – abx78

Problemi correlati