Parâmetros em lambdas assíncronos
Estou tentando executar várias tarefas ao mesmo tempo e me deparei com um problema que não consigo entender nem resolver.
Eu costumava ter uma função 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 eu queria ligar em umfor
loop usandoTask.Run()
. No entanto, não consegui encontrar uma maneira de enviar parâmetros para esteAction<int, bool>
e todos recomendam o uso de lambdas em casos semelhantes:
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;
}
}
Eu pensei que usar variáveis locais em lambdas "capturaria" seus valores, mas parece que não; ele sempre pegará o valor do índice como se o valor fosse capturado no final dofor
loop. oindex
variável é avaliada em 400 no lambda em cada iteração então é claro que eu recebo umIndexOutOfRangeException
400 vezes (items.Count
é na verdadeMAX
).
Eu realmente não tenho certeza sobre o que está acontecendo aqui (embora eu esteja realmente curioso sobre isso) e eu também não sei como fazer o que estou tentando alcançar. Qualquer sugestão é bem vinda!