2014-02-03 7 views
4

В моем приложении Windows Phone 8, я собираю список элементов из веб-api. После этого я петлю все элементы и получаю детали для каждого элемента.Windows Phone, несколько запросов HTTP-запросов, сколько?

Сейчас мой код что-то вроде этого:

List<plane> planes = await planeService.getPlanes(); // Get all planes from web api 

foreach(Plane plane in planes) 
{ 
    var details = await planeService.getDetails(plane.id); // Get one plane details from web api 

    drawDetails(details); 
} 

Как я могу улучшить это сделать множественный запрос параллельно и то, что является доступным количество запросов работает параллельно? Список планов может состоять из от 0 до 100 объектов, как правило, максимум 20.

ответ

4

Как я могу улучшить это, чтобы параллельно выполнять несколько запросов?

Вы можете выполнить параллельную обработку, как показано ниже (непроверенная). Он использует SemaphoreSlim для дроссельной заслонки getDetails запросов.

async Task ProcessPlanes() 
{ 
    const int MAX_REQUESTS = 50; 

    List<plane> planes = await planeService.getPlanes(); // Get all planes from web api 

    var semaphore = new SemaphoreSlim(MAX_REQUESTS); 

    Func<string, Task<Details>> getDetailsAsync = async (id) => 
    { 
     await semaphore.WaitAsync(); 
     try 
     {   
      var details = await planeService.getDetails(id); 
      drawDetails(details); 
      return details; 
     } 
     finally 
     { 
      semaphore.Release(); 
     } 
    }; 

    var tasks = planes.Select((plane) => 
     getDetailsAsync(plane.id)); 

    await Task.WhenAll(tasks.ToArray()); 
} 

, что является доступным количество запросов параллельно? Список самолетов может быть что угодно, от 0 до 100 объектов, как правило, не более 20.

это в значительной степени иждивенцы на сервере, но я не думаю, что есть окончательный ответ на этот вопрос. Например, проверить этот вопрос:

A reasonable number of simultaneous, asynchronous ajax requests

Насколько клиент КР8 идет, я считаю, это может породить 100 параллельных запросов без проблем.

+1

Спасибо Noseratio! – devha

+2

Я думаю, вы обнаружите, что WP8 имеет ограничение на количество одновременных подключений, разрешенных хосту. Я слышал, что это около 6-8. Это ограничение должно автоматически регулировать ваши запросы. –

+0

@ DarrelMiller, спасибо, я доверяю вам в этом вопросе. Я не занимался производством WP8. – Noseratio

-1

Вы должны проверить ServicePoint, это обеспечит управление соединениями для HTTP-соединений. Максимальное количество одновременных подключений по умолчанию, разрешенных объектом ServicePoint, равно 2. Поэтому, если вам нужно увеличить его, вы можете использовать ServicePointManager.DefaultConnectionLimit property. Просто проверьте ссылку в MSDN там, вы можете увидеть образец. И установите нужное значение. Это может вам помочь.

+0

Любая идея, с которой можно начать с нуля? Как я работаю с мобильным устройством, я думаю, что это может быть совсем не так, как на рабочих столах? – devha

+0

ServicePointManager недоступен на WP8 –

1

Я не знаю, какой предел для сетевых подключений, но будет один.

Если бы не было, единственной проблемой было бы количество памяти, используемое для сохранения того, что многие запросы оживают.

Таким образом, предполагая, что основную операционную систему будет обрабатывать дросселирование должным образом, я хотел бы сделать что-то это:

List<plane> planes = await planeService.getPlanes(); 

var allDetails = Task.WhenAll(from plane in plains 
           select planeService.getDetails(plane.id)); 

foreach(var details in allDetails) 
{ 
    drawDetails(details); 
} 

ПРИМЕЧАНИЯ: Вы должны следовать общим соглашениям об именах, чтобы помочь другим понять код. Асинхронные методы должны быть суффиксными Async и в * C# именами методов всегда являются CamelCase.

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