それは普通のことですループのキャプチャの問題 - ループ変数をキャプチャしたので、スレッドが実際に起動するまでにi
が最終値になります。これは配列の無効なインデックスです。解決策は、新しい変数内部ループを作成することで、代わりにキャプチャ:
Thread[] threads = new Thread[threadData.Length];
for (int i = 0; i < threadData.Length; i++)
{
int copy = i;
threads[i]= new System.Threading.Thread(() => threadWork(threadData[copy]));
threads[i].Start();
}
あなたはエリックリペットのブログでこの詳細については読むことができます:part 1を。 part 2。
個人的には、可能であればforeach
を使用するか、LINQを使用することを個人的に考えていきます。List<T>
foreach
はこの問題を解決しませんでしたが、それは一般的にはより洗練されたIMOです。
List<Thread> threads = threadData.Select(x => new Thread(() => ThreadWork(x)))
.ToList();
foreach (Thread thread in threads)
{
thread.Start();
}
もしくは直foreachループで、あなたが行くように、各スレッドを開始:ここで
は、あなたがLINQでそれを行っているかもしれない方法の例です
List<Thread> threads = new List<Thread>();
foreach (var data in threadData)
{
var dataCopy = data;
Thread thread = new Thread(() => ThreadWork(dataCopy));
thread.Start();
threads.Add(thread);
}
ありがとうございました。私は最初に返信した人の正解をマークしました。 – deadlock
@デッドロック:実際にあなたはしなかった...私はchibacityがした前に少しだけ答えたが、心配しないでください:) –
@ジョン:はい、私は間違っていました。正解はあなたのためにJonに行く。 – deadlock