При обычном использовании Ping программа работает очень долго и зависает. Как можно распараллелить Ping?
Asked
Active
Viewed 141 times
1
-
Как понять "При обычно использовании Ping" ? Приведите пример вашего кода для начала. – koks_rs Mar 18 '16 at 13:02
-
Ping p = new Ping(); PingReply reply = p.Send("addres"); – Alexandr Samodurov Mar 18 '16 at 13:04
1 Answers
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 прочитайте внимательнее комментарий в коде: "вне консольного приложения стоит писать await Task.WhenAll(tasks)". Плюс вы уже уже справились в предыдущем вопросе. – andreycha Mar 18 '16 at 13:58
-
@Alexis это немножко костыль :). Лучше дать async/await волю расползтись по коду, если есть возможность. – andreycha Mar 18 '16 at 13:59
-