2011-03-26 20 views
7

Estoy tratando de usar TPL dentro de un ciclo while y necesito pasar a la tarea algunos valores que luego cambian al ciclo. Por ejemplo, aquí se muestra un ejemplo con un índice que se incrementa (necesariamente después de la línea en la que se solicita la creación de la tarea):Iniciar tareas dentro de un bucle: cómo pasar valores que se pueden cambiar dentro del bucle?

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    tasks[index] = Task.Factory.StartNew(() => DoJob(index)); 
    index++; 
} 

Pero por supuesto que no funciona, ya que el valor del índice puede ser incrementado antes del inicio de la tarea. Una posible solución podría ser pasar un WaitHandle en el que esperar antes de incrementar el índice y que se debe señalar en el método DoJob, pero no me parece una buena solución. ¿Alguna otra idea?

Respuesta

15

Asignar el valor de una variable temporal dentro del bucle:

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    int value = index; 
    tasks[index] = Task.Factory.StartNew(() => DoJob(value)); 
    index++; 
} 

De esa manera cada tarea tendrá su propia copia del valor que index tenían durante la iteración del bucle while en el que llama a StartNew era hecho.

+0

el refactor no siempre es así de sencillo, pero siempre debería ser posible, no obstaculice los bucles anidados:] –

Cuestiones relacionadas