1

我正在尝试使用任务并行库逐个单元格地构建矩阵。

我有以下代码可以做到这一点:

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 中。

不知道还有什么地方可以看。

谢谢,

4

2 回答 2

2

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

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

因为它是<和不是<=,它已经确保最后一个项目是campaigns[campaigns.Count - 1]

于 2012-06-29T19:38:00.217 回答
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而是构建段。

于 2012-06-29T19:52:45.353 回答