Comment puis-je capturer la valeur d'une variable externe dans une expression lambda?

Je viens de rencontré le problème suivant:

for (var i = 0; i < 50; ++i) {
    Task.Factory.StartNew(() => {
        Debug.Print("Error: " + i.ToString());
    });
}

Entraînera dans une série de "Erreur: x", où la plupart des x sont égales à 50.

De la même façon:

var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();

En résulte "à l'Aide de la valeur: Après".

Cela signifie clairement que la concaténation dans l'expression lambda ne se produit pas immédiatement. Comment est-il possible d'utiliser une copie de l'extérieur de la variable dans l'expression lambda, au moment où l'expression est déclarée? Le code suivant ne fonctionnera pas mieux (ce qui n'est pas forcément incohérent, je l'avoue):

var a = "Before";
var task = new Task(() => {
    var a2 = a;
    Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();

source d'informationauteur Erwin Mayer