有谁知道为什么这段代码会返回超出范围的异常?
例如,如果 leastAbstractions
List 实例具有 count == 10
,则循环将执行 11
次,并以 i = 10
结束code> 并返回此异常。
for (int i = 0; i < leastAbstractions.Count; i++)
{
Task.Factory.StartNew((object state) =>
{
this.Authenticate(new HighFragment(leastAbstractions[i])).Reactivate();
}, TaskCreationOptions.PreferFairness);
}
最佳答案
您的循环实际上并未执行 11 次 - 它只执行了 10 次,但当其中一些任务执行时 i == 10。
这是正常问题 - 您正在 lambda 表达式中捕获循环变量。只需复制计数器并捕获它即可:
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 的值不同
.
关于c# - 并行代码抛出 OutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836721/