Jak mogę przechwycić wartość zmiennej zewnętrznej wewnątrz wyrażenia lambda?
Właśnie spotkałem następujące zachowanie:
for (var i = 0; i < 50; ++i) {
Task.Factory.StartNew(() => {
Debug.Print("Error: " + i.ToString());
});
}
Powoduje serię „Błąd: x”, gdzie większość x równa się 50.
Podobnie:
var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();
Spowoduje to „Używanie wartości: Po”.
Oznacza to wyraźnie, że konkatenacja w wyrażeniu lambda nie następuje natychmiast. W jaki sposób można użyć kopii zmiennej zewnętrznej w wyrażeniu lambda w momencie zadeklarowania wyrażenia? Poniższe nie będą działać lepiej (co niekoniecznie jest niespójne, przyznaję):
var a = "Before";
var task = new Task(() => {
var a2 = a;
Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();