programacion parallel paralelizar paralela net c# synchronization locking parallel-processing

c# - parallel - Incrementar un valor de conteo fuera del alcance paralelo. Foreach



parallel foreach vb net (3)

¿Cómo puedo incrementar un valor entero fuera del alcance de un bucle paralelo.para cada uno? ¿Cuál es la forma más sencilla de sincronizar el acceso a objetos fuera de los bucles paralelos?

var count = 0; Parallel.ForEach(collection, item => { action(item); // increment count?? }


¡Me gusta vencer a los caballos muertos! :)

La forma "más ligera" de incrementar el conteo desde múltiples hilos es:

Interlocked.Increment(ref count);

Pero como otros lo han señalado: si lo estás haciendo dentro de Parallel.ForEach entonces probablemente estás haciendo algo mal.

ForEach que por alguna razón está usando ForEach pero necesita un índice para el elemento que está procesando (nunca funcionará con Parallel.ForEach ). ¿Estoy cerca? ¿Por qué necesitas la cuenta? ¿Qué tipo de magia VooDoo estás tratando de hacer?

ACTUALIZAR:

Parece estar seguro con el ConcurrentDictionary si su clave es el URI y el valor es TAnswer . No veo un problema siempre y cuando no intentes usar el recuento para hacer referencia a los elementos de tu colección.

Finalmente...

Si necesita un contador, use el bucle Parallel.For ... con seguridad incrementa el contador para usted.


Utilice Interlocked.Increment .

No incrementaría las cosas dentro de un foreach paralelo (a menos que, por supuesto, estés usando Interlocked.Increment o algún otro mecanismo de bloqueo). Eso no es para lo que es. Parale foreach debe ejecutarse solo con acciones que no causen efectos secundarios en estado compartido. Incrementar un valor en un foreach paralelo causará el mismo problema que probablemente intentará evitar.


Utilice el método de enclavamiento interbloqueado de esta manera.

int count = 0; Parallel.ForEach(users, (u) => { var currentCount = Interlocked.Increment(ref count); Log(String.Format("Step {0} of {1}", currentCount, users.Count)); });