在循环中启动线程,将数组元素传递给每个线程

本文关键字:线程 数组元素 循环 启动 | 更新日期: 2023-09-27 18:24:00

我在一个循环中启动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)
{
}

为什么会发生这种情况?

在循环中启动线程,将数组元素传递给每个线程

这是一个常见的错误: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)
{
}