2012-06-29 54 views
1

我正在嘗試使用任務並行庫按單元格構建Matrix單元格。任務並行庫ArgumentException

我有下面的代碼,這是否:

List<Campaign> campaigns = GetHomeCampaigns(); 
Dictionary<int, string> sellers = GetHomeSellers(); 

int numTasks = campaigns.Count*sellers.Count; 
Task<MatrixCell<string>>[] statusTasks = new Task<MatrixCell<string>>[numTasks]; 

int count = 0;     
for(int i = 0; i < campaigns.Count -1;i++) 
{ 
    for(int j = 0; j < sellers.Count -1;j++) 
    { 
     Func<MatrixCell<string>> getStatus =() => GetStatus(campaigns[i].CampaignID, sellers.ElementAt(j).Key); 
     statusTasks[count] = Task.Factory.StartNew(getStatus); 
     count++; 
    } 
} 
Task.WaitAll(statusTasks); 

什麼,我試圖做的是處理和確定並行每個單元格,然後一旦全部建成,組裝按行矩陣行附加的代碼與本例無關。

我面對現在的問題是以下行

Task.WaitAll(statusTasks) 

我正在以下的ArgumentException

The tasks array included at least one null element. 
Parameter name: tasks 

我檢查了陣列,它顯示了所有項目都存在在statusTasks中。

不知道還有什麼地方看。

感謝,

回答

2

當您使用一個基於0的索引語言for循環,你不需要做< .Count - 1。這應該是:

for (int i = 0; i < campaigns.Count; i++) 

既然是<而不是<=,它已經保證了最後一個項目將是campaigns[campaigns.Count - 1]

+1

這意味着數組中有* * null。 – svick

+0

@svick:的確如此。 OP不會迭代所有條目,因此任務數組最後未滿。 – mellamokb

2

如果你真的想使用TPL,可以考慮使用Parallel類:

Parallel.For(0, campaigns.Count, i => // the outer loop is most important 
{ 
    Parallel.For(0, sellers.Count, j => 
    { 
     GetStatus(campaigns[i].CampaignID, sellers.ElementAt(j).Key); 
    } 
})); 
// no Waiting here 

這將使用分區程序,可能會決定不使用一個任務,每j但建段。