2011-08-25 15 views
12

Estoy usando un Paralelo.Forma para rellenar un ConcurrentBag externo. Intenté también usar una lista común y todo funciona bien.Cuando un ConcurrentBag es mejor que una lista?

He tenido la suerte o me perdí el alcance especial de ConcurrentBag?

+0

¿Cuántos núcleos/CPU tiene su equipo de desarrollo? – ChaosPandion

+0

Dos procesadores. – abx78

Respuesta

18

Has tenido suerte; Parallel.ForEach para llenar una Lista no es seguro para subprocesos, eventualmente se encontrará con problemas.

Según MSDN, List<T> no es hilo de seguridad:

los miembros de instancias no se garantiza que sea seguro para subprocesos.

Una lista <T> puede admitir varios lectores al mismo tiempo, siempre que la colección no se modifique. La enumeración a través de una colección es intrínsecamente no es un procedimiento seguro para subprocesos. En el raro caso en que una enumeración contenga uno o más accesos de escritura, la única forma de garantizar la seguridad del subproceso es bloquear la recopilación durante toda la enumeración . Para permitir que la colección sea accedida por múltiples hilos para lectura y escritura, debe implementar su propia sincronización .

ConcurrentBag es lo que debe utilizar para esto, que es seguro para subprocesos para varios lectores y escritores.

+0

¡Gracias por aclarar esto! – abx78

+0

Le damos la bienvenida. Marque una de las respuestas como aceptada. ¡Gracias! –

5

Si está usando Parallel.ForEach para llenar un List<T> y todo está funcionando bien entonces simplemente tiene suerte. El método ForEach puede y ejecutará su código en varios subprocesos, por lo que cualquier comunicación fuera del ForEach debe estar con objetos que puedan manejar actualizaciones concurrentes. List<T> no puede pero ConcurrentBag<T> puede.

+0

Ambas preguntas fueron buenas, ¡gracias! – abx78

Cuestiones relacionadas