Параметры в асинхронных лямбдах

Я пытаюсь выполнить несколько задач одновременно, и я столкнулся с проблемой, которую не могу понять или решить.

Раньше у меня была такая функция:

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

Что я хотел позвонить вfor использование циклаTask.Run(), Однако я не мог найти способ отправить параметры этомуAction<int, bool> и все рекомендуют использовать лямбды в подобных случаях:

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

Я думал, что использование локальных переменных в лямбдах будет «захватывать» их значения, но похоже, что нет; он всегда будет принимать значение индекса, как если бы значение было записано в концеfor петля.index переменная оценивается в 400 в лямбда на каждой итерации, поэтому, конечно, я получаюIndexOutOfRangeException 400 раз (items.Count на самом делеMAX).

Я действительно не уверен в том, что здесь происходит (хотя мне это очень интересно), и я не знаю, как сделать то, чего я пытаюсь достичь. Любые намеки приветствуются!

Ответы на вопрос(2)

Ваш ответ на вопрос