Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why would Task object not use parameter passed to it?

Tags:

c#

task

I'm using Task to process multiple requests in parallel and passing a different parameter to each task but it seems all the tasks takes one final parameter and execute the method using that.

Below is the sample code. I was expecting output as:

0 1 2 3 4 5 6 ..99

but I get:

100 100 100 ..10 .

May be before print method is called, i's value is already 100 but shouldn't each method print the parameter passed to it? Why would print method takes the final value of i?

class Program
{
    static void Main(string[] args)
    {
        Task[]t = new Task[100];
        for (int i = 0; i < 100; i++)
        {
            t[i] = Task.Factory.StartNew(() => print(i));
        }
        Task.WaitAll(t);
        Console.WriteLine("complete");
        Console.ReadLine();
    }

    private static void print(object i)
    {

        Console.WriteLine((int)i);
    }
}
like image 553
Kapil Avatar asked Nov 19 '13 13:11

Kapil


1 Answers

You're a victim of a closure. A simplest fix to this issue is:

    for (int i = 0; i < 100; i++)
    {
        int v = i;
        t[i] = Task.Factory.StartNew(() => print(v));
    }

You can find more detailed explanations here and here.

like image 176
BartoszKP Avatar answered Sep 19 '22 06:09

BartoszKP