Wie kann ich den Wert einer äußeren Variablen in einem Lambda-Ausdruck erfassen?
Ich bin gerade auf folgendes Verhalten gestoßen:
for (var i = 0; i < 50; ++i) {
Task.Factory.StartNew(() => {
Debug.Print("Error: " + i.ToString());
});
}
Wird zu einer Reihe von "Error: x" führen, wobei die meisten x gleich 50 sind.
Ähnlich:
var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();
Ergibt "Using value: After".
Dies bedeutet eindeutig, dass die Verkettung im Lambda-Ausdruck nicht sofort auftritt. Wie ist es möglich, eine Kopie der äußeren Variablen im Lambda-Ausdruck zum Zeitpunkt der Deklaration des Ausdrucks zu verwenden? Folgendes wird nicht besser funktionieren (was nicht unbedingt inkohärent ist, gebe ich zu):
var a = "Before";
var task = new Task(() => {
var a2 = a;
Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();