我正在尝试同时运行多个任务,但遇到了一个我似乎无法理解或解决的问题。
我曾经有这样的功能:
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>
,每个人都建议在类似情况下使用 lambdas:
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;
}
}
我认为在 lambdas 中使用局部变量会“捕获”它们的值,但看起来并没有;它总是取 index 的值,就好像该值将在for
循环结束时被捕获一样。index
在每次迭代中,该变量在 lambda 中被评估为 400,所以我当然得到了IndexOutOfRangeException
400 次(items.Count
实际上是MAX
)。
我真的不确定这里发生了什么(尽管我真的很好奇),我也不知道如何去做我想要实现的目标。欢迎任何提示!