Параллельный код выдает OutOfRangeException - PullRequest
2 голосов
/ 29 января 2011

Кто-нибудь знает, как этот код возвращает исключение из диапазона?
Например, если экземпляр списка leastAbstractions имеет count == 10, цикл будет выполняться 11 раз, заканчивая i = 10 и возвращая это исключение.

 for (int i = 0; i < leastAbstractions.Count; i++)
 {
     Task.Factory.StartNew((object state) =>
     {
         this.Authenticate(new HighFragment(leastAbstractions[i])).Reactivate();
     }, TaskCreationOptions.PreferFairness);
 }  

1 Ответ

4 голосов
/ 29 января 2011

Ваш цикл не на самом деле выполняется 11 раз - он выполняется только 10 раз, но я == 10 к тому времени, когда некоторые из этих задач выполняются.

Это нормальная проблема -вы захватываете переменную цикла в лямбда-выражении.Просто возьмите копию счетчика и запишите его:

for (int i = 0; i < leastAbstractions.Count; i++)
 {
     int copy = i;
     Task.Factory.StartNew((object state) =>
     {
         this.Authenticate(new HighFragment(leastAbstractions[copy]))
                                     .Reactivate();
     }, TaskCreationOptions.PreferFairness);
 }

Таким образом, когда ваша задача будет выполнена, вы увидите текущее значение "экземпляра" copy, которое вы захватили -и это значение никогда не меняется, в отличие от значения i.

См. сообщения Эрика Липперта в блоге по этому вопросу: part 1 ; часть 2 .

...