正如您可以清楚地看到 args[] 的最高索引是 2,但是迭代器以某种方式达到 3。解释?
编辑:评论的 Thread.Sleep 神奇地解决了这个问题。
正如您可以清楚地看到 args[] 的最高索引是 2,但是迭代器以某种方式达到 3。解释?
编辑:评论的 Thread.Sleep 神奇地解决了这个问题。
这是由于i
在 for 循环之外声明整个 for 循环造成的。由于无法保证Thread
在该点执行 ,因此 的值i
可以在Thread
执行之前更改。您可以通过在 for 循环中声明一个局部变量来“解决”这个问题。
//for loop ..
var localIndex = i;
var temp = new Thread(() => PrintOut(args[localIndex], IsFilePath(args[localIndex])));
temp.Start();
//for loop ..
编辑:另外,你能不能请你下次发布一个代码片段,让我不必再次写出代码:P
首先
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
为 2 时开始的执行在当i
增加到 3 时会受到影响。
要解决此问题,您需要i
在每次循环迭代时将 的值复制到一个新变量中。此副本不会被for
循环更新:
for (var i = 0; i< args.Length; i++)
{
var copy = i;
Thread temp = new Thread(() => PrintOut(args[copy], IsFilePath(args[copy]))
}