2014-02-21 14 views
1

多個我使用以下代碼來創建多個線程,這將在給定的範圍內的陣列上工作(最小,最大)環路用於創建不同的線程派生中的同一個

當我只跑這個代碼陣列的下半部分是被修改了,所以我把名字外地到Threads.advance,這樣我可以打印出線程的數量,當我做我得到以下幾點:

Thread Stopped: 2 Range: 25 50 
Thread Stopped: 2 Range: 25 50 

這是令人困惑原因有兩個:

1)numThreads變量爲2,因此for循環應該從0到1,但名稱打印爲2.

2)所有正在生成的線程具有相同的範圍和名稱,即使值我在for循環中傳遞更改。

Task[] tasks = new Task[numThreads]; 
int minRange, maxRange; 
for (int i = 0; i < numThreads; i++) 
{ 
    minRange = worldlength/numThreads * i; 
    maxRange = worldlength/numThreads * (i + 1); 
    tasks[i] = (Task.Factory.StartNew(() => Threads.advance(minRange, maxRange, i.ToString()))); 
}      
Console.WriteLine(); 
Task.WaitAll(tasks); 
+1

重複的「閉包和循環」問題...搜索...像http://stackoverflow.com/questions/4341031/different-behaviors-with-a-for-loop-and-a-foreach-loop -with-closures - 鏈接到[關閉循環變量被認爲是有害的](http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered -harmful.aspx) –

+0

[C#中的lambda如何綁定到foreach中的枚舉器?](http://stackoverflow.com/questions/2413706/how-does-a-lambda-in-c-清除綁定到枚舉器在一個foreach) –

回答

2

試着改變你的循環是這樣的:

// int minRange, maxRange; - declare inside loop instead!! 
for (int i = 0; i < numThreads; i++) 
{ 
    var i2 = i; 
    int minRange = worldlength/numThreads * i; 
    int maxRange = worldlength/numThreads * (i + 1); 
    tasks[i] = (Task.Factory.StartNew(() => 
      Threads.advance(minRange, maxRange, i2.ToString()))); 
} 

,因爲你需要傳遞一個任務裏面之前捕捉到循環內的變量,應該給你正確的輸出。

+0

這已修復了正在修復的線程的名稱,兩個範圍的範圍是多少(25,50)。在循環中保持範圍是否也解決了問題?編輯:創建循環內的變量,而不是在頂部固定範圍。 – Jiig

+0

@Jiigles - 是的,你是對的。我會改變我的代碼。 – Enigmativity

相關問題