2

有谁知道为什么这段代码返回超出范围异常吗?
例如,如果leastAbstractions列表实例具有count == 10,则循环将执行11次完成i = 10并返回此异常。并行代码抛出OutOfRangeException

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

回答

4

你的循环不是实际上执行11次 - 这只是执行10次,但我== 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的值。

查看Eric Lippert的博文:part 1; part 2

+0

我认为计数器在创建新任务时立即作为参数传递。我想我错了。谢谢。 – pevogam 2011-01-29 12:09:39