1

Task Parallel Library を使用して、セルごとにマトリックスを構築しようとしています。

これを行う次のコードがあります。

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

これは、おそらく Task for every を使用せずにjセグメントを構築することを決定する Partitioner を使用します。

于 2012-06-29T19:52:45.353 に答える