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!