这段代码会导致IndexOutOfBoundsException 谁能告诉我为什么? 我无法理解为什么它会导致IndexOutOfBoundsException
private static String TRACE_PATH = "..\\..\\TRACES";
static void Main(string[] args)
{
if (Directory.Exists(TRACE_PATH))
{
String[] traceEntries = Directory.GetFiles(TRACE_PATH);
Thread[] traceReaders = new Thread[traceEntries.Length];
for (int i = 0; i < traceEntries.Length; i++)
{
traceReaders[i] = new Thread(()=>readTrace(traceEntries[i]));
traceReaders[i].Start();
}
}
Console.Read();
}
private static void readTrace(String traceFile)
{
using (StreamReader sr = new StreamReader(traceFile))
{
//code to use the trace file...
}
}
答案 0 :(得分:6)
只需在循环中声明一个临时变量即可。您正在捕获变量而不是值。
for (int i = 0; i < traceEntries.Length; i++)
{
var j = i;
traceReaders[j] = new Thread(()=>readTrace(traceEntries[j]));
traceReaders[j].Start();
}
答案 1 :(得分:1)
我更喜欢这样写。
for (int i = 0; i < traceEntries.Length; i++)
{
var traceEntry = traceEntries[i];
traceReaders[i] = new Thread(() => readTrace(traceEntry));
traceReaders[i].Start();
}
解释是您的变量i
作为参数发送到lambda表达式。当lamba表达式在线程上执行时,你的for循环将会完成,因此i
将等于traceEnties.Length
。
通过将traceEntry
声明为局部变量,可以删除在for循环中更新的局部变量i
的依赖关系。
同样的事情发生在L.B.的回答中。我想这是一个如何处理它的品味问题。