Причина, по которой C # оценивает анонимные методы, не является истинным замыканием.Это действительно не имеет ничего общего с TPL.Следующий код распечатывает все d.Это не то, чего ожидал бы yoy
List<Task> tasks = new List<Task>();
List<string> lists = new List<string>();
lists.AddRange(new string[] { "a", "b", "c", "d" });
foreach (var list in lists)
{
tasks.Add(Task.Factory.StartNew(() =>
{
Console.WriteLine(list);
}));
}
Причина в том, что значение list , когда анонимный метод был создан , не является тем, которое оценивается втело метода.Используется значение list в то время, когда метод выполнялся .Вы можете принудительно исправить это, выполнив следующие действия:
List<Task> tasks = new List<Task>();
List<string> lists = new List<string>();
lists.AddRange(new string[] { "a", "b", "c", "d" });
foreach (var list in lists)
{
var localList = list;
tasks.Add(Task.Factory.StartNew(() =>
{
Console.WriteLine(localList);
}));
}
Вам не нужно явно передавать значение списка анонимному методу.
Это сообщение в блоге относится к этомуболее подробно:
http://blogs.msdn.com/b/abhinaba/archive/2005/10/18/482180.aspx