为什么Task对象不会使用传递给它的参数?

Kap*_*pil 5 c# task

我正在使用Task并行处理多个请求并将不同的参数传递给每个任务,但似乎所有任务都需要一个最终参数并使用它执行该方法.

下面是示例代码.我期待输出为:

0 1 2 3 4 5 6 ..99

但我得到:

100 100 100 ..10.

可能在打印方法被调用之前,i的值已经100不过每个方法都应该打印传递给它的参数吗?为什么print方法取最终值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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*zKP 4

你是关闭的受害者。解决此问题的最简单方法是:

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

您可以在这里这里找到更详细的解释。