具有任务数组IndexOutOfRangeException的C#for循环

时间:2019-05-01 14:55:46

标签: c# for-loop task

im启动10个任务以从Web api获取结果。我在offsets数组上得到IndexOutOfRangeException。但是它怎么可能。 实际上,“ i”变量Canot大于或等于10。 有人能帮忙吗? For循环无法正常工作?

            times = 10;
            Task[] tasks = new Task[times];
            int[] offsets = new int[times];

            for (int i = 0; i < times; i++)
            {
                offsets[i] = offset;
                tasks[i] = Task.Run(() => SearchLocalByQuery(query, offsets[i], (i + 1)));
                offset += Limit;
            }
            Task.WaitAll(tasks);

i = 10,

在此示例中,我不能在10 in for循环中退出。

System.IndexOutOfRangeException:“索引在数组的边界之外。”

1 个答案:

答案 0 :(得分:1)

  

在此示例中,我不能在10 in for循环中退出。

它可以在lambda表达式中为 。表达式:

() => SearchLocalByQuery(query, offsets[i], (i + 1))

捕获变量 i,并在执行变量时对其求值。 Task.Run立即返回,但不一定已经开始执行委托-因此,很可能在评估i之前,循环已移至下一个迭代或已完成。

最简单的解决方法是声明一个局部变量以在循环内捕获i

for (int i = 0; i < times; i++)
{
    int copy = i;
    offsets[i] = offset;
    // Make sure we only use copy within the lambda expression
    tasks[i] = Task.Run(() => SearchLocalByQuery(query, offsets[copy], copy + 1));
    offset += Limit;
}

现在,每次循环迭代都会有一个新的copy变量,并且该变量将永远不会更改其值-因此,lambda表达式将使用“ i的值执行该变量循环”,无论i current 值是什么。