任务并行库ArgumentException

时间:2012-06-29 19:33:08

标签: c# .net task-parallel-library

我正在尝试使用任务并行库来逐个单元构建Matrix。

我有以下代码执行此操作:

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);

我尝试做的是并行处理和确定每个单元格,然后一旦完成,就逐行组装Matrix,并附加与此示例无关的其他代码。

我现在面临的问题是以下一行

Task.WaitAll(statusTasks)

我收到以下ArgumentException

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

我检查了数组,它显示了statusTasks中存在的所有项目。

不确定在哪里可以看。

谢谢,

2 个答案:

答案 0 :(得分:2)

当您在基于0的索引语言中使用for循环时,您不需要执行< .Count - 1。那应该是:

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

由于它是<而不是<=,因此它已确保最后一项为campaigns[campaigns.Count - 1]

答案 1 :(得分: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使用任务,而是构建分段。