2010-11-01 10 views
5

Tengo varias operaciones en paralelo. Para las sucesivas.. Paralelo sucesivo de .NET para - Bloqueo después de cada

Actualmente estoy examinando el valor de retorno de cada Parallel.For ParallelLoopResult y durmiendo durante 20 milisegundos hasta que el miembro IsCompleted se establezca en verdadero.


Dim plr as ParallelLoopResult 

plr = Parallel.For(...) 

while not plr.IsCompleted 
    Thread.Sleep(20) 
end while 

plr = Parallel.For(...) 

while not plr.IsCompleted 
    Thread.Sleep(20) 
end while 

. 
. 
. 

¿Cómo puedo añadir un bloque de nivel de núcleo (es decir WaitHandle) en lugar del bucle y Thread.Sleep? ¿Hay algún evento de finalización que Parallel.For triggers? ¿Parallel.For provee para tal mecanismo?

Respuesta

4

El Parallel.For completará todos los códigos para los que fue creado. El IsCompleted solo devuelve false y luego se interrumpió el ciclo.

De http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallelloopresult.aspx:

Si IsCompleted devuelve verdadero, entonces el bucle corrió hasta su finalización, de tal manera que se ejecutaron todas las iteraciones del bucle. Si IsCompleted devuelve false y LowestBreakIteration devuelve null, se utilizó una llamada a Stop para finalizar el ciclo prematuramente. Si IsCompleted devuelve false y LowestBreakIteration devuelve un valor integral no nulo, se usó Break para finalizar el ciclo prematuramente.

+0

Cierto, pero no responde a mi pregunta de cómo esperar hasta que el ciclo finalice utilizando una construcción de nivel de kernel. – ColorEyes

+0

Pero no hay nada de qué esperar. Piensa que lo que estás preguntando es cómo puedes dormir el hilo hasta que algunas señales parezcan que 'IsCompleted' ha cambiado. El problema es que 'IsCompleted' nunca cambiará después de que' Parallel.For' se haya completado. –

+0

Si creo un WaitHandle, ¿cómo podría señalar ese identificador de espera cuando finalice el Parallel.For? – ColorEyes

1

¡no puedes conseguir WaitHandle para Parallel.For() y usted no necesita - llamada es síncrona (todas las iteraciones se completará después de la llamada es terminada). Si necesita ejecutar el bucle en sí mismo en otro hilo, no solo en las iteraciones, debe envolverlo en Task o Thread, y esos objetos le proporcionarán identificadores de espera. Pero si va a esperar los resultados en el mismo hilo al llamar al Parallel.For() (como en su código de muestra), no tiene ningún sentido.

Cuestiones relacionadas