首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行代码抛出OutOfRangeException

并行代码抛出OutOfRangeException
EN

Stack Overflow用户
提问于 2011-01-29 19:59:07
回答 1查看 430关注 0票数 2

有人知道为什么这段代码会返回超出范围的异常吗?

例如,如果leastAbstractions列表实例具有count == 10,则循环将执行11,并以i = 10结束并返回此异常。

代码语言:javascript
复制
 for (int i = 0; i < leastAbstractions.Count; i++)
 {
     Task.Factory.StartNew((object state) =>
     {
         this.Authenticate(new HighFragment(leastAbstractions[i])).Reactivate();
     }, TaskCreationOptions.PreferFairness);
 }  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-29 20:00:49

您的循环实际上并没有执行11次-它只执行了10次,但是当其中一些任务执行时,我==了10次。

这是一个正常的问题--你在一个lambda表达式中捕获一个循环变量。只需复制一份计数器,并将其捕获:

代码语言:javascript
复制
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 1part 2

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4836721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档