我對多線程編程並不感到滿意,當我試圖在我的代碼中實現它時,遇到了一個異常,我無法找出原因。在任何幫助,這將不勝感激:)
所以,基本上我有該小代碼段:多線程程序中的IndexOutOfRange異常
string[][] Array1 = new string[thread_count][];
/* Logic to insert data in Array1 */
Thread[] WorkerThreads = new Thread[thread_count];
for (int i = 0; i < thread_count; i++)
{
/* THE EXCEPTION OCCURS IN THE FOLLOWING LINE */
WorkerThreads[i] = new Thread(() => GetVal(Array1[i], val, num));
WorkerThreads[i].Start();
}
for (int i = 0; i < WorkerThreads.Length; i++)
WorkerThreads[i].Join();
現在,THREAD_COUNT值設置爲10,我正在一個IndexOutOfRange例外。調試器將i的值顯示爲10,而Array1 [10] []是它嘗試訪問的值。
當循環不應該運行那麼遠時,我不明白我的值可以達到10。
任何人都可以指出我哪裏錯了?我正在使用C#。
感謝
我遵循的關閉都引用相同的變量'i' - 而不是i'有__value__'在那個循環中。但爲什麼創建一個臨時變量'j'從根本上改變綁定/範圍的方式? –
由於「j」在循環內部具有局部範圍,因此會爲循環的每次迭代創建一個新的「j」。每個lambda表達式都有自己的副本。雖然「i」在循環的外部範圍中,所以變量在每次迭代中都被重用,並且每個lambda表達式都獲得相同的變量,並在循環之後重用。 – fcuesta
謝謝@fcuesta - 我可以從邏輯上分析這一點,但我不確定我是否直觀地得到它:) Javascript中出現相同的情況我相信,特別是使用jQuery「處理程序」函數。 –