Ожидание завершения всех асинхронных вызовов Ping.SendAsync - C#

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

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

Сканирую локальную сеть по айпишнику, и получаю список

IPAddress

, которые пингуются : Main функция (делегат был не обязательным) :
Листинг программы
  1. Scanner s = new Scanner();
  2. List<IPAddress> l = s.ScanLocal(IPAddress.Parse("10.108.1.155"), Console.WriteLine);
Класс сканера :
Листинг программы
  1. class Scanner
  2. {
  3. public AutoResetEvent waiter;
  4. public delegate void Report(string s);
  5. List<IPAddress> result = new List<IPAddress>();
  6. Report ReportMethod;
  7. public Scanner()
  8. {
  9. this.waiter = new AutoResetEvent(false);
  10. }
  11. public List<IPAddress> ScanLocal(IPAddress hostAddress, Report Method)
  12. {
  13. ReportMethod = Method;
  14. IPHostEntry host = Dns.GetHostEntry(hostAddress);
  15. byte[] ip = host.AddressList[4].GetAddressBytes();
  16. int host_ip = ip[3];
  17. for (ip[3] = 0; ip[3] < host_ip; ip[3]++)
  18. AddIfAlive(new IPAddress(ip));
  19. for (ip[3] = (byte)(host_ip + 1); ip[3] != 255; ip[3]++)
  20. AddIfAlive(new IPAddress(ip));
  21. return result;
  22. }
  23. public void AddIfAlive(IPAddress address)
  24. {
  25. Ping pingSender = new Ping();
  26. PingOptions packetOptions = new PingOptions(50, true);
  27. byte[] packetData = Encoding.ASCII.GetBytes("....");
  28. pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
  29. pingSender.SendAsync(address, 10, packetData, packetOptions, waiter);
  30. }
  31. private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
  32. {
  33. PingReply reply = e.Reply;
  34. if (reply.Status == IPStatus.Success)
  35. {
  36. result.Add(e.Reply.Address);
  37. ReportMethod.Invoke(e.Reply.Address.ToString());
  38. }
  39. }
Можно отсылать синхронные запросы, но ето будет слишком медленно. В примерах MSDN использовался

AutoResetEvent

, но я не могу понять, где его здесь использовать. Проблема в том, что после завершения

ScanLocal

некоторые вызовы еще не завершились, и продолжают изменять список

IPAddress

.

Вопрос :

как мне дождаться завершения всех вызовов

Ping.SendAsync

? Большая просьба, если кому-либо не сложно, показать возможные улучшения кода. В универе занимаемся формами и кнопками

Решение задачи: «Ожидание завершения всех асинхронных вызовов Ping.SendAsync»

textual
Листинг программы
  1. public async Task<string> Ping(int timeout, string ip)
  2.         {
  3.             Ping ping = new Ping();
  4.             try
  5.             {
  6.                 PingReply answer = await ping.SendPingAsync(ip, timeout);
  7.                 if (answer.Status == IPStatus.Success)
  8.                 {
  9.                     return answer.Address.ToString() + "|" + await GetMACAddress(answer.Address) + "|" + answer.RoundtripTime +
  10.                                "|" + Dns.GetHostEntry(answer.Address.ToString()).HostName;
  11.                 }
  12.             }
  13.             catch(Exception ex)
  14.             {
  15.                 MessageBox.Show(ex.Message);
  16.             }
  17.             return "";
  18.         }
  19.  
  20. public async Task<string> GetMACAddress(IPAddress ip)
  21.         {
  22.            
  23.             return await Task.Run(() =>
  24.             {
  25.                 byte[] macAddr = new byte[6];
  26.                 uint macAddrLen = (uint)macAddr.Length;
  27.                 try
  28.                 {
  29.                     SendARP(BitConverter.ToInt32(ip.GetAddressBytes(), 0), 0, macAddr, ref macAddrLen);
  30.                 }
  31.                 catch (Exception ex)
  32.                 {
  33.                     MessageBox.Show(ex.Message);
  34.                 }
  35.                 string[] sMacAddress = new string[(int)macAddrLen];
  36.                 for (int i = 0; i < macAddrLen; i++)
  37.                 {
  38.                     sMacAddress[i] = macAddr[i].ToString("x2");
  39.                 }
  40.                 return string.Join(":", sMacAddress).ToUpper();
  41.             });        
  42.         }

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


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

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

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы