我在用着Task
并行处理多个请求并向每个任务传递不同的参数,但似乎所有任务都采用一个最终参数并使用该参数执行该方法。
下面是示例代码。我期望输出为:
0 1 2 3 4 5 6 ..99
但我得到:
100 100 100 ..10 。
可能在调用 print 方法之前,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);
}
}
你是受害者closure。解决此问题的最简单方法是:
for (int i = 0; i < 100; i++)
{
int v = i;
t[i] = Task.Factory.StartNew(() => print(v));
}
你可以找到更详细的解释here and here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)