1

これまで、PLINQを使用して、forループをマルチタスク速度のデーモンに変えるのは簡単でした。

しかし、コレクションのコレクションを処理するために苦労しています。

私はおそらくこれを自分で理解するでしょうが、他の人がこれをどのように解決するかを見るのも役立つだろうと思いました。

更新:以下のコードには概念上の問題があると確信していますが、完全に言葉で表現することはできませんでした。誰かが私が話していることを見ることができれば、素晴らしいですが、私はこれについてもっと考えて、質問を全体的に改善しようとします(または、それが完全に私の間違いだとわかった場合は削除します)

主なロジックは次のとおりです。

    public static void Execute()
    {
        var service = Locator.Get<ICakeService>();
        using (var db = new Cake.Model.CakeContainer())
        {
            foreach (var campaigns in service.ExportCampaigns())
            {
                // --> THIS LOOP SHOULD BE EXECUTED IN A SEPARATE THREAD
                foreach (var campaign in campaigns)
                {
                    // ... logic to process a campaign ...
                }
            }
        }
    }

サービスは次のとおりです。

    public IEnumerable<campaign[]> ExportCampaigns()
    {
        campaign[] result = null;
        var service = new exportSoapClient("exportSoap");
        // --> IF I DO A PARALLEL FOREACH HERE THE CLIENT CODE ABOVE 
        // STOPS MAKING SENSE TO ME...
        foreach (var offer in this.ExportOffers())
        {
            var response = service.Campaigns(
                                api_key: this.apiKey,
                                offer_id: offer.offer_id);
            yield return result;
        }
    }
4

2 に答える 2

2

並列化のもう 1 つのオプションは、

Parallel.Foreach(service.ExportCampaigns(), campaigns =>
{
    // --> THIS LOOP will be run in multiple threads at the same time


    foreach (var campaign in campaigns)
    {
        // ... logic to process a campaign ...
    }
});

内部foreachの作業が少なすぎる場合、これはesskar のソリューションよりも優れたオプションになる可能性があります。

これはラムダのないバージョンです

public static void Execute(Action<campaign[]> action)
{
    var service = Locator.Get<ICakeService>();
    using (var db = new Cake.Model.CakeContainer())
    {
        Parallel.Foreach(service.ExportCampaigns(), action);
    }
}

//This method will be executed in parallel for each element in the IEnumerable<campaign[]>.
private void ProcessCampaigns(campaign[] campaigns)
{
    foreach (var campaign in campaigns)
    {
        // ... logic to process a campaign ...
    }
}

// Call to Execute looks something like this:
command.Execute(ProcessCampaigns)
于 2012-05-18T17:04:00.133 に答える
0

System.Threading.TaskのParallel Helper を使用する

Parallel.Foreach(campaigns, compaign => 
{
    // ... logic to process a campaign ...
});

編集:ここに完全な例があります

public static void Execute()
{
    var service = Locator.Get<ICakeService>();
    using (var db = new Cake.Model.CakeContainer())
    {
        foreach (var campaigns in service.ExportCampaigns())
        {
            ProcessCampaigns(campaigns);                
        }
    }
}

private void ProcessCampaigns(IEnumerable<Campaign>> campaigns)
{
    Parallel.Foreach(compaigns, ProcessCampaign);
}

private void ProcessCampaign(Campaign campaign)
{
    // ... logic to process a campaign ...
}
于 2012-05-18T16:53:02.397 に答える