1

При обычном использовании Ping программа работает очень долго и зависает. Как можно распараллелить Ping?

1 Answers1

2

Смотрите мой ответ на один из ваших предыдущих вопросов. Ситуация совершенно аналогичная, только вместо WebRequest и GetResponseAsync() используйте Ping, SendPingAsync. Это будет более разумным использованием ресурсов, см. ответы тут и тут.

public class Program
{
    public static void Main(params string[] args)
    {
        var ipAddresses = new List<string>()
        {
            "1.1.1.1", "2.2.2.2", "3.3.3.3"
        };

        var progress = new Progress<string>(s => Console.WriteLine(s));
        var tasks = ipAddresses.Select(a => PingAddress(a, progress)).ToArray();
        // вне консольного приложения стоит писать await Task.WhenAll(tasks)
        Task.WaitAll(tasks);
    }

    private static async Task PingAddress(string ipAddress, IProgress<string> progress)
    {
        // TODO: не забудьте добавить обработку ошибок
        var ping = new Ping();
        PingReply reply = await ping.SendPingAsync(ipAddress);
        progress.Report(string.Format("{0} - {1}", ipAddress, reply.Status));
    }
}
andreycha
  • 25,167
  • 4
  • 46
  • 82
  • SendPingAsync(address) должна принимать IP, а не URL https://msdn.microsoft.com/en-gb/library/system.net.networkinformation.ping.sendpingasync%28v=vs.110%29.aspx – koks_rs Mar 18 '16 at 13:35
  • Когда начинает выполняться этот метод , то приложение зависает и не реагирует ни на какие действия, можно ли это исправить? – Alexandr Samodurov Mar 18 '16 at 13:35
  • @koks_rs, ну значит добавить Dns.Resolve(address).AddressList[0], и использовать IP адрес. Ну и не забыть на пустоту проверить массив адресов. – Alexis Mar 18 '16 at 13:36
  • @AlexandrSamodurov, запустите содержимое метода Main в отдельной задаче. – Alexis Mar 18 '16 at 13:39
  • Ip я уже получил, но все-равно программа перестает отвечать пока выполняется этот метод. Хотя метод возвращает нужный результат – Alexandr Samodurov Mar 18 '16 at 13:40
  • @AlexandrSamodurov, Task.Run(()=> { тут код из main});, – Alexis Mar 18 '16 at 13:41
  • А как быть не в консольном приложении? – Alexandr Samodurov Mar 18 '16 at 13:48
  • Спасибо огромное всем за помощь. Все получилось – Alexandr Samodurov Mar 18 '16 at 13:58
  • @AlexandrSamodurov прочитайте внимательнее комментарий в коде: "вне консольного приложения стоит писать await Task.WhenAll(tasks)". Плюс вы уже уже справились в предыдущем вопросе. – andreycha Mar 18 '16 at 13:58
  • @Alexis это немножко костыль :). Лучше дать async/await волю расползтись по коду, если есть возможность. – andreycha Mar 18 '16 at 13:59
  • @koks_rs спасибо, поправил пример. – andreycha Mar 18 '16 at 13:59