Parámetros en lambdas asíncronas.
Estoy intentando ejecutar varias tareas al mismo tiempo y me encontré con un problema que no puedo entender ni resolver.
Solía tener una función 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 queria llamar en unafor
bucle usandoTask.Run()
. Sin embargo no pude encontrar una forma de enviar parámetros a esteAction<int, bool>
y todos recomiendan usar lambdas en casos similares:
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;
}
}
Pensé que usar variables locales en las lambdas "capturaría" sus valores, pero parece que no; siempre tomará el valor del índice como si el valor fuera capturado al final delfor
lazo. losindex
la variable se evalúa a 400 en la lambda en cada iteración, así que por supuesto recibo unaIndexOutOfRangeException
400 veces (items.Count
es en realidadMAX
).
Realmente no estoy seguro de lo que está sucediendo aquí (aunque tengo mucha curiosidad) y tampoco sé cómo hacer lo que estoy tratando de lograr. ¡Cualquier consejo es bienvenido!