這里僅討論Task多線程編程,不討論其他可以使用多線程的情況,比如Beginxxx,Thread等
一般情況下,如果有多個線程需要同是啟動,且每個線程中使用了集合collection中的序號。
比如參數中帶數組中的一個數據,比如:
int[] nArray = new int[] {0,1,2,3};
然后需要用多線程的方式,同時處理其中的每個數據。
如果你寫成,下面這種方式:
Task[] taskArray = new Task[4];
for (int i=0; i < 4; i++)
{
task[i] = Test(nArray[i]);
}
就會發現,拋出了數組越界的異常。
但是如果你改成:
Task[] taskArray = new Task[4];
for (int i=0; i < 4; i++)
{
int n = i;
task[n] = Test(nArray[n]);
}
就會發現,多線程運行正常了。
原因是什么呢?
第一個是因為,Task因為是新的語法糖,處理Task的時候,需要一定的時間,這個時間肯定是比for里面
i++;
i<4;
這兩句話要來的長的,所以等實際上生成四個Task,准備啟動的時候,就會發現,這個時候的i已經加到4了,自然就產生了越界。
第二個方法,能生效,是因為 n = i;將每個工作域中的i都賦予了局部變量n,這樣每個Task的參數即為局部變量n,就不會因為i的變化而變化。