首页 新闻 会员 周边 捐助

关于动态创建task的问

0
悬赏园豆:10 [已解决问题] 解决于 2014-08-21 17:58

for (int i = 0; i < count; i++)
{
int a = i;
tasks[a] = Task.Factory.StartNew(() => dosomething(out temps[a], (length / count) * a, (length / count) * (a + 1), bytImages));
// tasks[i] = Task.Factory.StartNew(() => dosomething(out temps[i], (length / count) * i, (length / count) * (i + 1), bytImages));
}

为什么必须定义一个新的变量a ,直接用i的话就提示数组越界

晨冬之雪的主页 晨冬之雪 | 初学一级 | 园豆:185
提问于:2014-08-21 17:10
< >
分享
最佳答案
0

这个主要是闭包引起的。因为dosomething没有立即执行,当执行的时候,使用temps[i],这个时候的i=count已经越界了,导致了数组越界这样的错误。

收获园豆:10
幻天芒 | 高人七级 |园豆:37207 | 2014-08-21 17:54

为什么就越界了,我感觉你说的很有道理,不过我还是不太理解呢,能再说详细点吗,谢谢

晨冬之雪 | 园豆:185 (初学一级) | 2014-08-21 17:56

@晨冬之雪: 就是新建Task内部方法,是一个方法引用。真正执行的时候,去拿i的值,这个i是方法体外部的。已经变成越界了。js里面很容易产生这样的闭包。

幻天芒 | 园豆:37207 (高人七级) | 2014-08-21 19:08

@幻天芒: 恩,谢谢,以前知道js里有闭包,c#之前还真没有注意闭包问题呢

晨冬之雪 | 园豆:185 (初学一级) | 2014-08-22 14:50

@晨冬之雪: 这个不太容易遇到,呵呵~

幻天芒 | 园豆:37207 (高人七级) | 2014-08-22 15:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册