通过闭包将参数传递给 Task.Run() 的问题

Issue with parameters passed into Task.Run() by closure

我已经阅读了按照一些答案中建议的方法,我会遇到以下问题。

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 传递到 Task.Run() 中的 lambda。原来传入的实际值确实取决于,但很可能它只是创建了所有 10 个任务然后运行它们,所以打印出来的只是所有 10,如: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.