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

sym*_*ont 2 c# arrays multithreading ref indexoutofboundsexception

我在一个循环中启动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)
{
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

das*_*ght 6

这是一个常见错误:我在线程启动时进行评估,这在循环结束后发生.创建一个临时文件,为其分配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)
{
}
Run Code Online (Sandbox Code Playgroud)