Я просто столкнулся с следующим поведением:
for (var i = 0; i < 50; ++i) {
Task.Factory.StartNew(() => {
Debug.Print("Error: " + i.ToString());
});
}
Приведёт к серии "Ошибка: x", где большая часть x равна 50.
Аналогично:
var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();
В результате "Использование значения: после".
Это явно означает, что конкатенация в лямбда-выражении не происходит немедленно. Как можно использовать копию внешней переменной в выражении лямбда, во время объявления выражения? Следующие не будут работать лучше (что не обязательно некогерентно, я признаю):
var a = "Before";
var task = new Task(() => {
var a2 = a;
Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();