2016-10-17 2 views
0

Этот фрагмент кода должен отправлять от 2 до 7 запросов для получения данных одновременно для уменьшения времени ожидания. На моем компьютере код запускал 6 секунд. Когда я загрузил его на Azure, он занимает 60 секунд. Если я открываю 2 окна версии Azure и запускаю их рядом, они берут 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

В Parallel.* методы предназначены для процессора связаны работы, потому что они используют CPU на основе эвристики, чтобы выбрать степень параллелизма. Для работы на основе ИО эти эвристики полностью не срабатывают. Оптимальное значение DOP для IO должно быть определено эмпирически. Он не может быть получен из числа ядер ЦП.

ВМ имеет только 1

Там вы идете. На меньшей виртуальной машине вы будете делать HTTP-звонки реже, что явно бессмысленно, потому что HTTP-вызовы потребляют небольшой процессор.

Используйте последний фрагмент кода от https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/ для обработки ваших рабочих предметов с фиксированной степенью параллелизма. В качестве дополнительного преимущества вы можете потерять звонки .Result.

.NET Framework позорно не имеет ничего встроенного, поэтому вы должны использовать этот код из блога.

Смежные вопросы