C# 线程和索引自动失效异常

C# 线程和索引自动失效异常,c#,multithreading,outofrangeexception,C#,Multithreading,Outofrangeexception,正如您可以清楚地看到的,args[]的最高索引是2,但是迭代器以某种方式达到了3。 解释 编辑:已注释的线程。睡眠神奇地解决了问题。这是由于在for循环外部为整个for循环声明了i。由于不能保证线程在该点执行,因此i的值可以在线程执行之前更改。您可以通过在for循环中声明一个局部变量来“解决”这个问题 //for loop .. var localIndex = i; var temp = new Thread(() => PrintOut(args[localIndex], IsFile

正如您可以清楚地看到的,args[]的最高索引是2,但是迭代器以某种方式达到了3。 解释


编辑:已注释的线程。睡眠神奇地解决了问题。

这是由于在for循环外部为整个for循环声明了
i
。由于不能保证
线程
在该点执行,因此
i
的值可以在
线程
执行之前更改。您可以通过在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++)
{
}

任何非线程安全的代码都有可能…如果我没有弄错的话,有两个线程…主线程和临时线程…主线程控制for循环..而临时线程[]控制字符串数组..
thread.Sleep(1)
通过强制主线程睡眠1毫秒来修复问题。我是对的吗?您应该删除额外的线程并验证是否获得异常。线程测试101!这是lambda捕获索引的问题,
i
。它与线程没有什么关系。对,在调用线程体之前执行
for
循环的incrementor(
i++
)。因此,在线程实际运行之前,
i
可以增加到
3
。始终认为对thread.Start的调用实际上启动了线程。一旦线程处于ThreadState.Running状态,操作系统就可以安排它执行
int i = 0;

loop:

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