foreachループ内のWebClient呼び出しを高速化する

ジョン・グ

私はasp.netmvc-5 Webアプリケーションに取り組んでおりWebClient()、サードパーティアプリケーションへの連続呼び出しを行うために次の呼び出しがあります。

public async Task<List<Technology>> GetResource(int? filtertype)
{

  try
  {
     using (WebClient wc = new WebClient()) 
     {
         string url = currentURL + "resources?AUTHTOKEN=" + token;
         var json = await wc.DownloadStringTaskAsync(url);
         resourcesinfo = JsonConvert.DeserializeObject<ResourcesInfo>(json);
     }

     //for each resource get its tag + add the tag to the list
     foreach (var c in resourcesinfo.operation.Details)
     {    
        ResourceAccountListInfo resourceAccountListInfo = new ResourceAccountListInfo();
        using (WebClient wc = new WebClient()) 
        {    
        string url = currentURL + "resources/" + c.RESOURCEID + "?AUTHTOKEN=" + token;
        string tempurl = url.Trim();    
        var json = await wc.DownloadStringTaskAsync(tempurl);
        resourceAccountListInfo = JsonConvert.DeserializeObject<ResourceAccountListInfo>(json);     
                       AllTags.Add(resourceAccountListInfo.SingleOrDefault().CUSTOMFIELDVALUE.ToLower());   
     }    
   }
}

現在、最初の呼び出しはWebClient約1,500レコードを返すため、WebClient内の2番目の呼び出しはforeach1,500回実行されるため、プロセス全体が完了するまでに約20分かかります。では、どうすればこのプロセスを改善できますか?

ネガティブエディ

DownloadStringTaskAsyncの呼び出しを調整する方法が必要です。セマフォとTask.Runを使用して手動で行うか、TPL Dataflowライブラリを使用してすべてのURLをフィードし、必要な制限まで並列度を指定することができます。データフローブロックは非同期デリゲートを受け入れます(Parallel.Forとは異なります)

private static async Task<Thing[]> ProcessAllUrls(string[] urls)
{
    var workBlock = new TransformBlock<string, Thing>(
        async url => await DownloadAndProcessUrl(url),
        new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 20 }
        );

    var outputBlock = new BufferBlock<Thing>();

    using (workBlock.LinkTo(outputBlock, new DataflowLinkOptions { PropagateCompletion = true }))
    {

        foreach (var url in urls)
        {
            workBlock.Post(url);
        }

        // signal no more input going into workblock
        workBlock.Complete();

        // wait for workblock to pump all data into outputblock
        await workBlock.Completion;

        IList<Thing> finalResult = null;
        bool result = outputBlock.TryReceiveAll(out finalResult);
        return finalResult.ToArray();
    }
}

ただし、Webサーバープロセス内で並列処理を行う場合は注意が必要です。WebClient呼び出しはCPUから完全に非同期ですが、応答を逆シリアル化する作業はスレッドプールスレッドで実行されます。つまり、この間、CPUリソースに対するASP.NET要求と競合しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

forループでのAPI呼び出しを高速化する方法

分類Dev

nodejsでの複数の待機中の呼び出しを高速化する

分類Dev

Rで関数内のforループを高速化する

分類Dev

phpapi呼び出しの高速化

分類Dev

ループ内でこの MATLAB コードを高速化する方法は?

分類Dev

.bash_profileのbrew--prefixの呼び出しを高速化する方法はありますか?

分類Dev

SKProductをディスクに永続化して、アプリの購入を高速化(ネットワーク呼び出しを削除)できますか?

分類Dev

PHPでループ内の単一クエリを高速化する方法は?

分類Dev

Pythonスクリプトのforループを高速化する

分類Dev

Rcppを使用してforループを高速化する方法は?

分類Dev

numbaを使用してforループを高速化する

分類Dev

パラメータと戻り値の型のプライベート型を持つ高速呼び出しデリゲートを作成して、DynamicInvokeを高速化する方法

分類Dev

このループコードを高速化する方法は?

分類Dev

anglejsのforeachループ内でAPIを呼び出す

分類Dev

pingを使用して、バッチファイルの処理を高速化しようとしています。ループから飛び出します

分類Dev

Web ページの読み込み時間を高速化する方法 (CRON? バックグラウンドでの API 呼び出しの読み込み?)

分類Dev

Python関数の「for」ループを高速化する方法は?

分類Dev

このPyMongoクエリ/ループを高速化する方法

分類Dev

SwiftのGrandCentral Dispatchを使用して、「for」ループを並列化および高速化しますか?

分類Dev

SwiftのGrandCentral Dispatchを使用して、「for」ループを並列化および高速化しますか?

分類Dev

VBAのForEachループを高速化するにはどうすればよいですか?

分類Dev

複数の非同期/待機呼び出しの実行を高速化

分類Dev

関数内のforループをベクトル計算に置き換えて、Rを高速化します

分類Dev

forループ内のコードを高速化

分類Dev

Dockerイメージ内のファイルを圧縮すると、プルが高速化されますか?

分類Dev

複数の呼び出しを高速化するために、実行時定数の値を関数ロケールの静的変数に格納することは良い/悪い習慣ですか?

分類Dev

Rループ内のRcpp評価を高速化

分類Dev

JavaScriptでネイティブメソッドの呼び出しを高速化できますか?

分類Dev

グループ内の別の列に基づいて選択的な累積合計を高速化する

Related 関連記事

  1. 1

    forループでのAPI呼び出しを高速化する方法

  2. 2

    nodejsでの複数の待機中の呼び出しを高速化する

  3. 3

    Rで関数内のforループを高速化する

  4. 4

    phpapi呼び出しの高速化

  5. 5

    ループ内でこの MATLAB コードを高速化する方法は?

  6. 6

    .bash_profileのbrew--prefixの呼び出しを高速化する方法はありますか?

  7. 7

    SKProductをディスクに永続化して、アプリの購入を高速化(ネットワーク呼び出しを削除)できますか?

  8. 8

    PHPでループ内の単一クエリを高速化する方法は?

  9. 9

    Pythonスクリプトのforループを高速化する

  10. 10

    Rcppを使用してforループを高速化する方法は?

  11. 11

    numbaを使用してforループを高速化する

  12. 12

    パラメータと戻り値の型のプライベート型を持つ高速呼び出しデリゲートを作成して、DynamicInvokeを高速化する方法

  13. 13

    このループコードを高速化する方法は?

  14. 14

    anglejsのforeachループ内でAPIを呼び出す

  15. 15

    pingを使用して、バッチファイルの処理を高速化しようとしています。ループから飛び出します

  16. 16

    Web ページの読み込み時間を高速化する方法 (CRON? バックグラウンドでの API 呼び出しの読み込み?)

  17. 17

    Python関数の「for」ループを高速化する方法は?

  18. 18

    このPyMongoクエリ/ループを高速化する方法

  19. 19

    SwiftのGrandCentral Dispatchを使用して、「for」ループを並列化および高速化しますか?

  20. 20

    SwiftのGrandCentral Dispatchを使用して、「for」ループを並列化および高速化しますか?

  21. 21

    VBAのForEachループを高速化するにはどうすればよいですか?

  22. 22

    複数の非同期/待機呼び出しの実行を高速化

  23. 23

    関数内のforループをベクトル計算に置き換えて、Rを高速化します

  24. 24

    forループ内のコードを高速化

  25. 25

    Dockerイメージ内のファイルを圧縮すると、プルが高速化されますか?

  26. 26

    複数の呼び出しを高速化するために、実行時定数の値を関数ロケールの静的変数に格納することは良い/悪い習慣ですか?

  27. 27

    Rループ内のRcpp評価を高速化

  28. 28

    JavaScriptでネイティブメソッドの呼び出しを高速化できますか?

  29. 29

    グループ内の別の列に基づいて選択的な累積合計を高速化する

ホットタグ

アーカイブ