2

我在一个循环中启动 4 个线程。每个线程获取对数组元素的引用以写入结果。

但是在我创建每个线程的那一行,我得到一个System.IndexOutOfRangeException. 我很惊讶索引“i”超出了范围。

这是一个例子:

void ThreadsStarter()
{
    double[] data = new double[4];

    for(int i = 0; i < 4; i++)
    {
        Thread my_thread = new Thread(() => Work(data[i]));
        my_thread.Start();
    }
}

void Work(double data)
{
}

为什么会这样?

4

1 回答 1

6

这是一个常见错误: i 在线程启动时被评估,这发生在循环结束后。创建一个 temp,将 i 分配给它,然后在 lambda 中使用 temp 而不是 i 来解决问题:

void ThreadsStarter()
{
    double[] data = new double[4];

    for(int i = 0; i < 4; i++)
    {
        var temp = i;
        Thread my_thread = new Thread(() => Work(ref data[temp]));
        my_thread.Start();
    }
}

void Work(ref double data)
{
}
于 2013-07-21T00:37:15.317 回答