我正在使用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)
你是关闭的受害者。解决此问题的最简单方法是:
for (int i = 0; i < 100; i++)
{
int v = i;
t[i] = Task.Factory.StartNew(() => print(v));
}
Run Code Online (Sandbox Code Playgroud)