2013-05-10 3 views
0

Я действительно смущен. Я запускаю следующий код для выполнения двух задач, которые работают с отдельными папками, поэтому я даю им индекс. К сожалению, когда я запускаю код, приведенный ниже, индекс передается ProcessingTask статический метод всегда 2 ...Изменения во время запуска задачи

 tasks = new Task[sets.ThreadCount]; 
     for (int i = 0; i < sets.ThreadCount; i++) 
     { 
      tasks[i] = Task.Factory.StartNew 
       (
       () => 
       { 
        ProcessingTask.run(
             i, 
             stack, 
             collector, 
             sets, 
             cts.Token, 
             LOG 
             ); 
       }, 
       cts.Token, 
       TaskCreationOptions.LongRunning, 
       TaskScheduler.Default 
       ); 
     } 

Любые идеи?

ответ

2

Вы должны поместить I во временную переменную и использовать его, т.е.

int iTemp = i; 
tasks[i] = Task.Factory.StartNew(() => { 
     ProcessingTask.run(
          iTemp, 
          stack, 
          collector, 
          sets, 
          cts.Token, 
          LOG 
          ); 
    }, 
    cts.Token, 
    TaskCreationOptions.LongRunning, 
    TaskScheduler.Default 
    ); 

см http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx для объяснения

+0

Большое спасибо за быстрый ответ. Это помогло! Я буду отмечать его в 4 минуты;) – Windys

Смежные вопросы