2011-02-07 67 views
3

我正在嘗試使用任務並行庫爲一系列項目調度函數調用。任務並行庫使用幫助

下不起作用

List<Task> tasks = new List<Task>(); 

foreach(var someValue in aCollection) 
{ 
    var t = Task.Factory.StartNew(() => DoSomeWork(someValue)); 
    tasks.Add(t); 
} 

Task.WaitAll(tasks.ToArray()); 

但下面的工作

Task.WaitAll(aCollection.Select(a => Task.Factory.StartNew(() => DoSomeWork(a))).ToArray()); 

對於其執行一次,然後停止第一種方法。我不確定它是否覆蓋引用或其他內容。有人可以請。說明?

還有一種方法可以將某個序列號傳遞給任務,該任務可用於識別首先安排哪個任務。我的意思是我想等待所有的任務完成,然後根據集合中的順序排序結果。

+1

見http://stackoverflow.com/questions/2956328/foreach-failing-when-using-parallel-task-library/3155693#3155693 – 2011-02-07 23:55:08

+0

@Jim:謝謝。關於序列事物的任何想法? – stackoverflowuser 2011-02-08 00:01:18

回答

5

我不知道這是否是導致停止執行,但也許是因爲你closing over the loop variable這裏:

DoSomeWork(someValue)); 

您需要創建一個局部變量,併爲其分配someValue給它,然後用再次

foreach(var someValue in aCollection) 
{ 
    var localCopy = someValue; 

    var t = Task.Factory.StartNew(() => DoSomeWork(localCopy)); 
    tasks.Add(t); 
} 

,我不知道如果是這樣的問題,你的僵局問題,而是一個問題是最有可能產生問題:即局部變量,因爲在我的鏈接的問題描述,像這樣。