Распараллеливание вызовов SendAsync (возможно с использованием LINQ) - C#

Узнай цену своей работы

Формулировка задачи:

Несколько дней ищу ответ на вопрос : как хорошо распределить вызовы

Ping.SendAsync

. Последний вариант который я пробовал -
// workingIPs - массив IPAddress
var temp =
    from ip in workingIPs.AsParallel().WithDegreeOfParallelism(16)
    let p = new Ping().Send(ip, 5)
    where (p.Status == IPStatus.Success)
    select p.Address;
 
List<IPAddress> result = temp.ToList<IPAddress>();
 
return result;
Но он работает медленно, у меня ~17 секунд на 256 адресов.

Пожалуйста

, помогите его доделать, сил уже нет.

Решение задачи: «Распараллеливание вызовов SendAsync (возможно с использованием LINQ)»

textual
Листинг программы
//workingIPs - массив IPAddress
//result is global variable
List<IPAddress> result = new List<IPAddress>();
Ping ping = new Ping();
ping.PingComplated = (sender, e) =>
{
  if (e.Error == null)
    //doing something with IP, that stored in e.UserState;
    lock (result) result.Add(e.UserState as IpAddress);
};
foreach (var ip in workingIPs)
  ping.SendAsync(ip, 5, ip);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы