这个问题在这里已有答案:
我读过Task.Run with Parameter(s)?按照一些答案中建议的方式,我会遇到以下问题。
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
tasks.Add(Task.Run(() => Console.WriteLine(i)));
Task.WaitAll(tasks.ToArray());
通常我会期望它每次将i
的值从0传递到9到Task.Run()
中的lambda。原来传入的实际值真的很依赖,但很可能它只创建了所有10个任务然后运行它们,所以打印出来的只是所有10
s如:10,10,10,10,10,10,10,10 ,10,10。或者有时它是:3,3,3,10,10,10,10,10,10,10。
那我怎么能很好地解决这个问题呢?或者在这种情况下,必须使用Task.Factory.StartNew()
?
尝试在循环中制作计数器的副本,如this answer。关闭这样的时刻很难解释和理解。试试看this。