es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo escribo un bucle C# Parallel.ForEach donde durante una parte del código, solo un hilo puede estar activo a la vez?

No estoy seguro si esto es posible sin mucho sobrecarga, pero pensé en preguntar.

Aquí está el proceso actual:

Bucle paralelo por ubicaciones
Bucle secuencial sobre operaciones de carga SQL para cada ubicación

Esto está funcionando bien, excepto que un procedimiento tiende a bloquearse si más de 1 hilo se está ejecutando al mismo tiempo.

¿Es posible asegurar que una vez que el procedimiento de bloqueo se está ejecutando, los demás hilos esperen hasta que esté completo si están intentando ejecutar el mismo procedimiento?

Tengo la sensación de que el bloqueo está involucrado, pero no hago esto lo suficiente como para estar seguro.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible asegurarse de que una vez que el procedimiento de bloqueo está en ejecución, todos los demás hilos esperen hasta que esté completo si están intentando ejecutar el mismo procedimiento. Esto se puede lograr implementando una declaración de bloqueo en el método que ejecuta el procedimiento de bloqueo. Esto evitará que otros hilos accedan al mismo recurso hasta que el bloqueo sea liberado por el hilo en ejecución.

    Por ejemplo, podrías modificar tu código de la siguiente manera:

    c#
    Parallel.ForEach(locations, location =>
    {
    lock(lockObject)
    {
    // Bucle secuencial sobre operaciones de carga SQL para cada ubicación
    // Llama al procedimiento de bloqueo aquí
    }
    });

    En este código, la declaración de bloqueo está envuelta alrededor del bucle secuencial sobre las operaciones de carga SQL para cada ubicación y la llamada al procedimiento de bloqueo. lockObject es un objeto compartido que sirve como un primitivo de sincronización para asegurarse de que solo un hilo pueda ejecutar el código dentro de la declaración de bloqueo en cualquier momento dado.

    Al hacer esto, si un hilo está actualmente ejecutando el procedimiento de bloqueo, todos los demás hilos que intenten ejecutar el mismo procedimiento esperarán hasta que el bloqueo sea liberado antes de que puedan ejecutar el código dentro de la declaración de bloqueo. Esto garantiza que el procedimiento de bloqueo pueda ejecutarse sin problemas causados por el acceso concurrente.

Comments are closed.