2014-06-20 22 views
0

我有100個價值觀如何在一個循環中

我想產卵5個線程來處理列表創建一批任務的20各

我的代碼基本上是

for (int i = 0; i<5; i++) 
{ 

    Task.Run(() => { 
     myMethod(myList.Skip(i * 20).Take(20))); 
    }); 
} 

顯然,因爲這關閉了我的價值,它可以完全搞砸了。我已經嘗試過所有我能想到的事情,以便在任務宣佈時獲得價值,但我沒有運氣。即使將Task.Run的第一行設置爲var localVariable = i;以捕獲它也不起作用,它將運行該方法,並且我每次都是5。

我該怎麼做,大概我想通過傳遞我的值來創建任務,因此它從不會看到函數的外部,但我無法弄清楚如何做到這一點。

任何想法?

回答

4

你就要成功了,但以及,創建局部變量的副本,你需要使用它在你的Lambda表達式:

for (int i = 0; i < 5; i++) 
{ 
    int localCopy = i; 
    Task.Run(() => { 
     myMethod(myList.Skip(localCopy * 20).Take(20))); 
    }); 
} 

如果還是不行,那麼問題不是變量捕獲 - 它在別處。

當然,另一種選擇是使用Parallel.ForEach與自定義分區,或類似的東西。換句話說,可能有更好的方法來解決這個問題。

+0

是的,這是行不通的。我假設,因爲循環速度非常快,所以它甚至可以運行5次Task.Run,​​甚至有機會運行一次。 – NibblyPig

+2

@SLC:「不起作用」不給我們提供任何信息,但它確實可以運行5個任務,其中一個將調用Skip(0),其中一個將調用Skip (20)',其中一個會調用'Skip(40)'等。正如我在答案中所說的,如果這個代碼不起作用,那麼你需要在其他地方尋找這個問題。 (我們沒有足夠的上下文來進一步幫助......) –

+0

試着在'myMethod'中放置一個斷點並檢查傳入的集合。每次都得到一組不同的20條記錄,或者只有相同的'myList'中最後20條記錄的集合? –

0

嘗試在任務外設置var localVariable = i