同時に複数のタスクを実行しようとしていますが、理解も解決もできないような問題に遭遇しました。
私はこのような機能を持っていました:
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 で評価されるindex
ので、もちろんIndexOutOfRangeException
400 回になります (items.Count
実際には ですMAX
)。
私はここで何が起こっているのか本当にわかりません (私はそれについて本当に興味がありますが)、私が達成しようとしていることを行う方法もわかりません。どんなヒントでも大歓迎です!