Вы закрываете переменную цикла - попробуйте это:
for (int i = 0; i < 20; i++)
{
int x = i;
Task.Factory.StartNew(() => MethodTest(x));
}
Важно понимать, что вы создаете замыкание над переменной i
, а не является ее текущим значением .
Ко времени, когда пул потоков запускает первый поток (они сначала попадают в очередь), переменная i
почти наверняка будет равна 20, поскольку вы вышли из цикла. Теперь каждый запущенный поток будет смотреть на значение переменной i
в тот момент времени .
Исправление в соответствии с предложением заключается в создании новой переменной внутри области видимости цикла и назначении текущей переменной i
этой переменной. Так как новая переменная используется на каждой итерации цикла, каждый созданный поток теперь закрывает свою «собственную» переменную, которая изолирована и не изменится.
Стандартная ссылка, объясняющая, что происходит: « Закрытие по переменной цикла, считающейся вредной ».