Я только что столкнулся со следующим поведением:
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();