2016-10-17 12 views
0

このコードは、待機時間を短縮するために同時にデータを取得する2〜7回の要求を送信することが想定されています。私のコンピュータ上でコードを実行するのに6秒かかりました。私がAzureにアップロードしたとき、それは60秒かかる。 Azureバージョンの2つのウィンドウを開き、それらを並べて実行すると、120秒かかります。彼らは私が望むように同時に走っていないか、複数のコールが同時にサーバにボトルネックを起こしているかのようです。誰にもアイデアはありますか?Task.Parallel.Forが並行して実行されていないようです

List<string> strs = new List<string>(); 
Parallel.For(0, uriArray.Count(), index => 
{ 
    using (var client = new HttpClient()) 
    { 
     var response = client.GetAsync(uriArray[index]).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var responseContent = response.Content; 
      var responseString = responseContent.ReadAsStreamAsync().Result; 

      using (GZipStream zip = new GZipStream(responseString, CompressionMode.Decompress, true)) 
      using (StreamReader unzip = new StreamReader(zip)) 
      { 
       strs.Add(unzip.ReadToEnd()); 
      } 
     } 
    } 
}); 
+2

マシンにいくつのコアがありますか? – Shyju

+0

@Shyju私のコンピュータには8があります – Mike

+1

Azureではどうですか? –

答えて

1

彼らは並列度を選択するCPUベースのヒューリスティックを使用しているためParallel.*方法は、CPUバウンドの仕事のために意図されています。 IOベースの作業では、これらのヒューリスティックは完全に失敗します。 IO の最適なDOPは、経験的に決定されなければならないでなければならない。これはCPUコアの数から導き出すことはできません。

VMしかない1

を持っているあなたが行きます。より小さいVMでは、HTTPコールの頻度が低くなります.HTTPコールがCPUをほとんど消費しないため、間違いがありません。

https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/の最後のコードを使用して、作業項目を一定の並列度で処理します。追加のメリットとして、.Resultコールを失う可能性があります。

.NET Frameworkには何も組み込まれていないため、このコードをブログから使用する必要があります。

関連する問題