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?
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?
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.
¡Gracias por aclarar esto! – abx78
Le damos la bienvenida. Marque una de las respuestas como aceptada. ¡Gracias! –
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.
Ambas preguntas fueron buenas, ¡gracias! – abx78
ConcurrentBag es la respuesta correcta, solo que en .NET 4.0 es muy lento. Esto ha sido arreglado en .NET 4.5. Ver http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0
Tanto ConcurrentStack y ConcurrentQueue también trabajarán en su situación ...
¿Cuántos núcleos/CPU tiene su equipo de desarrollo? – ChaosPandion
Dos procesadores. – abx78