Why would Task object not use parameter passed to it?

c#, task

Solution

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.

Problem

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); } } ```

Original source