繁体   English   中英

任务并行库ArgumentException

[英]Task Parallel Library ArgumentException

我试图使用任务并行库来按单元格构建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的索引语言中使用for循环时,不需要执行< .Count - 1 那应该是:

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

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

如果您真的想使用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使用一个任务,而是构建分段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM