Parametry w asynchronicznych lambdach

Próbuję uruchomić kilka zadań jednocześnie i natknąłem się na problem, którego nie mogę zrozumieć ani rozwiązać.

Kiedyś miałem taką funkcję:

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

Że chciałem zadzwonićfor używać pętliTask.Run(). Nie udało mi się jednak znaleźć sposobu na przesłanie parametrówAction<int, bool> i wszyscy zalecają używanie lambd w podobnych przypadkach:

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

Myślałem, że użycie zmiennych lokalnych w lambdach „przechwytuje” ich wartości, ale wygląda na to, że nie; zawsze będzie przyjmować wartość indeksu tak, jakby wartość została przechwycona na końcufor pętla. Theindex zmienna jest obliczana przy 400 w lambdzie przy każdej iteracji, więc oczywiście otrzymujęIndexOutOfRangeException 400 razy (items.Count jest aktualneMAX).

Naprawdę nie jestem pewien, co się tutaj dzieje (choć jestem naprawdę ciekawy) i nie wiem, jak zrobić to, co próbuję osiągnąć. Wszelkie wskazówki są mile widziane!

questionAnswers(2)

yourAnswerToTheQuestion