通过闭包将参数传递给 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.
我已经阅读了
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.