线程和IndexOutOfRange异常

时间:2014-04-09 00:35:22

标签: c# multithreading outofrangeexception

Note that in the locals i = 3

你可以清楚地看到args []的最高索引是2,但迭代器不知何故达到3。 解释

编辑:评论过的Thread.Sleep神奇地解决了这个问题。

2 个答案:

答案 0 :(得分:5)

这是由for {循环之外的for循环声明i引起的。由于无法保证此时执行Threadi的值可能会在Thread执行之前发生变化。您可以通过在for循环中声明一个局部变量来“解决”这个问题。

//for loop ..
var localIndex = i;
var temp = new Thread(() => PrintOut(args[localIndex], IsFilePath(args[localIndex])));
temp.Start();
//for loop ..

编辑:另外,请你下次发一个代码片段,让我不得不再次写出代码:P

答案 1 :(得分:1)

首先

for (var i = 0; i< args.Length; i++)
{
}

相当于:

int i = 0;

loop:

if (i < args.Length)
{
    i++;
    goto loop;
}

所以你看到i增加到3以检查你的情况。

当然,当new Thread(() => PrintOut(args[i], IsFilePath(args[i])))为3时,i实际上从未被调用过。但是,由于每次迭代循环都只有一个i实例,因此启动执行当i增加到3时i为2时会受到影响。

要解决此问题,您需要在每次循环迭代时将i的值复制到新变量中。 for循环不会更新此副本:

for (var i = 0; i< args.Length; i++)
{
     var copy = i;
     Thread temp = new Thread(() => PrintOut(args[copy], IsFilePath(args[copy]))
}