Параметры в асинхронных лямбдах
Я пытаюсь выполнить несколько задач одновременно, и я столкнулся с проблемой, которую не могу понять или решить.
Раньше у меня была такая функция:
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;
}
Что я хотел позвонить вfor
использование циклаTask.Run()
, Однако я не мог найти способ отправить параметры этомуAction<int, bool>
и все рекомендуют использовать лямбды в подобных случаях:
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;
}
}
Я думал, что использование локальных переменных в лямбдах будет «захватывать» их значения, но похоже, что нет; он всегда будет принимать значение индекса, как если бы значение было записано в концеfor
петля.index
переменная оценивается в 400 в лямбда на каждой итерации, поэтому, конечно, я получаюIndexOutOfRangeException
400 раз (items.Count
на самом делеMAX
).
Я действительно не уверен в том, что здесь происходит (хотя мне это очень интересно), и я не знаю, как сделать то, чего я пытаюсь достичь. Любые намеки приветствуются!