我正在尝试使用任务并行库来逐个单元构建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中存在的所有项目。
不确定在哪里可以看。
谢谢,
答案 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
使用任务,而是构建分段。