Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Почему индекс выходит за границы массива?

#c_sharp


var tasks = new Task[queenCount];
for (int i = 0; i < queenCount; i++)
    tasks[i] = Task.Run(() => CalculatePeacefulArrangement(queenCount, chessTables[i],
queenCount, resultArray, i));
Task.WaitAll(tasks);


И например, прописав от руки все вызываемые методы через Parallel.Invoke все работает.
    


Ответы

Ответ 1



for (int i = 0; i < queenCount; i++) { int index = i; tasks[i] = Task.Run(() => CalculatePeacefulArrangement(queenCount, chessTables[index], queenCount, resultArray, index)); } Переменная i, которая в цикле захватывается анонимными лямбда-функциями (в Вашем коде), - одна на всех. К моменту исполнения этих анонимных функций значение i с большой вероятностью изменилось. Даже если Вы не получили выход за границу массива, значение этой переменной в момент вызова CalculatePeacefulArrangement - не то, что Вы ожидаете. С переменной index, объявленной внутри блока, каждая анонимная функция видит свой экземпляр index, имеющий значение, которое присвоено переменной index на соответствующей итерации цикла.

Комментариев нет:

Отправить комментарий