Pregunta

i start 4 threads in a loop. each thread gets a reference to an array element to write the result.

But on the line where i create each thread, i get a System.IndexOutOfRangeException. I'm amazed that the index "i" is going out of range.

here is an example:

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)
{
}

Why this is happening?

¿Fue útil?

Solución

This is a common error: i gets evaluated when threads starts, which happens after the loop has ended. Make a temp, assign i to it, and use temp instead of i in your lambda to fix the issue:

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)
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top