Parâmetros em lambdas assíncronos

Estou tentando executar várias tarefas ao mesmo tempo e me deparei com um problema que não consigo entender nem resolver.

Eu costumava ter uma função 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 eu queria ligar em umfor loop usandoTask.Run(). No entanto, não consegui encontrar uma maneira de enviar parâmetros para esteAction<int, bool> e todos recomendam o uso de lambdas em casos semelhantes:

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;
    }
}

Eu pensei que usar variáveis ​​locais em lambdas "capturaria" seus valores, mas parece que não; ele sempre pegará o valor do índice como se o valor fosse capturado no final dofor loop. oindex variável é avaliada em 400 no lambda em cada iteração então é claro que eu recebo umIndexOutOfRangeException 400 vezes (items.Count é na verdadeMAX).

Eu realmente não tenho certeza sobre o que está acontecendo aqui (embora eu esteja realmente curioso sobre isso) e eu também não sei como fazer o que estou tentando alcançar. Qualquer sugestão é bem vinda!

questionAnswers(2)

yourAnswerToTheQuestion