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:“索引在数组的边界之外。”
答案 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 值是什么。