問題は、変数 i
がキャプチャされており、スレッドが実際に開始されるまでに 2 になっていることです。
代わりにこれを使用してください:
for (int i = 0; i < numberOfThreads; i++)
{
int value = x[i];
new Thread(() => DoWork(value)).Start();
}
または:
foreach (int value in x)
{
int copy = value;
new Thread(() => DoWork(copy)).Start();
}
または:
for (int i = 0; i < numberOfThreads; i++)
{
int copyOfI = i;
new Thread(() => DoWork(x[copyOfI])).Start();
}
いずれの場合も、ラムダ式は、ループの反復ごとに新しい変数をキャプチャします。この変数は、後続の反復では変更されません。
一般に、後で実行されるラムダ式でループ変数をキャプチャすることは避けるべきです。詳細については、このトピックに関するEric Lippert のブログ投稿を参照してください。
C# 5 の時点で、foreach
これが問題になるのを回避するためにループの動作が変更される可能性がありますが、for
同等のループは依然として問題になります。