¿Cómo puedo capturar el valor de una variable externa dentro de una expresión lambda?

Acabo de encontrar el siguiente comportamiento:

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

Resultará en una serie de "Error: x", donde la mayoría de las x son iguales a 50.

Similar:

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

Resultará en "Usar valor: Después".

Esto significa claramente que la concatenación en la expresión lambda no se produce inmediatamente. ¿Cómo es posible usar una copia de la variable externa en la expresión lambda, en el momento en que se declara la expresión? Lo siguiente no funcionará mejor (lo cual no es necesariamente incoherente, lo admito):

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta