线程导致IndexOutOfBounds异常

时间:2014-01-04 22:13:36

标签: c# multithreading

这段代码会导致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...
    }
}

2 个答案:

答案 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.的回答中。我想这是一个如何处理它的品味问题。