這是正常的循環捕獲問題 - 你已經捕獲了循環變量,所以在線程實際啓動的時候,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。
就個人而言,我會考慮使用更多的List<T>
,並儘可能使用foreach
甚至LINQ。誠然,foreach
不會解決這個問題,但它通常會更清潔IMO。
這裏有一個如何在LINQ已經做了一個例子:
List<Thread> threads = threadData.Select(x => new Thread(() => ThreadWork(x)))
.ToList();
foreach (Thread thread in threads)
{
thread.Start();
}
還是採用了直板foreach循環,從每一個線程,當您去:
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 2011-01-24 20:54:42