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!