Parameter in asynchronen Lambdas

Ich versuche, mehrere Aufgaben gleichzeitig auszuführen, und bin auf ein Problem gestoßen, das ich offenbar nicht verstehen oder lösen kann.

Früher hatte ich eine Funktion wie diese:

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

Dass ich einen anrufen wolltefor Schleife mitTask.Run(). Allerdings konnte ich keine Möglichkeit finden, Parameter an diese zu sendenAction<int, bool> und jeder empfiehlt die Verwendung von Lambdas in ähnlichen Fällen:

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

Ich dachte, die Verwendung lokaler Variablen in Lambdas würde deren Werte "erfassen", aber es sieht so aus, als ob dies nicht der Fall ist. Es wird immer der Wert von index verwendet, als würde der Wert am Ende von erfasstfor Schleife. Dasindex Variable wird bei jeder Iteration bei 400 im Lambda ausgewertet, also bekomme ich natürlich eineIndexOutOfRangeException 400 mal (items.Count ist eigentlichMAX).

Ich bin mir wirklich nicht sicher, was hier passiert (obwohl ich wirklich neugierig bin) und ich weiß auch nicht, wie ich das tun soll, was ich erreichen will. Irgendwelche Tipps sind willkommen!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage