Parámetros en lambdas asíncronas.

Estoy intentando ejecutar varias tareas al mismo tiempo y me encontré con un problema que no puedo entender ni resolver.

Solía ​​tener una función como esta:

private void async DoThings(int index, bool b) {
    await SomeAsynchronousTasks();
    var item = items[index];
    item.DoSomeProcessing();
    if(b)
        AVolatileList[index] = item; //volatile or not, it does not work
    else
        AnotherVolatileList[index] = item;
}

Que queria llamar en unafor bucle usandoTask.Run(). Sin embargo no pude encontrar una forma de enviar parámetros a esteAction<int, bool> y todos recomiendan usar lambdas en casos similares:

for(int index = 0; index < MAX; index++) { //let's say that MAX equals 400 
    bool b = CheckSomething();
    Task.Run(async () => {
        await SomeAsynchronousTasks();
        var item = items[index]; //here, index is always evaluated at 400
        item.DoSomeProcessing();
        if(b)
            AVolatileList[index] = item; //volatile or not, it does not work
        else
            AnotherVolatileList[index] = item;
    }
}

Pensé que usar variables locales en las lambdas "capturaría" sus valores, pero parece que no; siempre tomará el valor del índice como si el valor fuera capturado al final delfor lazo. losindex la variable se evalúa a 400 en la lambda en cada iteración, así que por supuesto recibo unaIndexOutOfRangeException 400 veces (items.Count es en realidadMAX).

Realmente no estoy seguro de lo que está sucediendo aquí (aunque tengo mucha curiosidad) y tampoco sé cómo hacer lo que estoy tratando de lograr. ¡Cualquier consejo es bienvenido!

Respuestas a la pregunta(2)

Su respuesta a la pregunta