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&nbsp;bucle usandoTask.Run(). Sin embargo no pude encontrar una forma de enviar parámetros a esteAction<int, bool>&nbsp;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&nbsp;lazo. losindex&nbsp;la variable se evalúa a 400 en la lambda en cada iteración, así que por supuesto recibo unaIndexOutOfRangeException&nbsp;400 veces (items.Count&nbsp;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!