Ожидание завершения всех асинхронных вызовов Ping.SendAsync - C#
Формулировка задачи:
Сканирую локальную сеть по айпишнику, и получаю список
Класс сканера :
Можно отсылать синхронные запросы, но ето будет слишком медленно. В примерах MSDN использовался
IPAddress
, которые пингуются : Main функция (делегат был не обязательным) :
Листинг программы
- Scanner s = new Scanner();
- List<IPAddress> l = s.ScanLocal(IPAddress.Parse("10.108.1.155"), Console.WriteLine);
Листинг программы
- class Scanner
- {
- public AutoResetEvent waiter;
- public delegate void Report(string s);
- List<IPAddress> result = new List<IPAddress>();
- Report ReportMethod;
- public Scanner()
- {
- this.waiter = new AutoResetEvent(false);
- }
- public List<IPAddress> ScanLocal(IPAddress hostAddress, Report Method)
- {
- ReportMethod = Method;
- IPHostEntry host = Dns.GetHostEntry(hostAddress);
- byte[] ip = host.AddressList[4].GetAddressBytes();
- int host_ip = ip[3];
- for (ip[3] = 0; ip[3] < host_ip; ip[3]++)
- AddIfAlive(new IPAddress(ip));
- for (ip[3] = (byte)(host_ip + 1); ip[3] != 255; ip[3]++)
- AddIfAlive(new IPAddress(ip));
- return result;
- }
- public void AddIfAlive(IPAddress address)
- {
- Ping pingSender = new Ping();
- PingOptions packetOptions = new PingOptions(50, true);
- byte[] packetData = Encoding.ASCII.GetBytes("....");
- pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
- pingSender.SendAsync(address, 10, packetData, packetOptions, waiter);
- }
- private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
- {
- PingReply reply = e.Reply;
- if (reply.Status == IPStatus.Success)
- {
- result.Add(e.Reply.Address);
- ReportMethod.Invoke(e.Reply.Address.ToString());
- }
- }
AutoResetEvent
, но я не могу понять, где его здесь использовать. Проблема в том, что после завершенияScanLocal
некоторые вызовы еще не завершились, и продолжают изменять списокIPAddress
.Вопрос :
как мне дождаться завершения всех вызововPing.SendAsync
? Большая просьба, если кому-либо не сложно, показать возможные улучшения кода. В универе занимаемся формами и кнопкамиРешение задачи: «Ожидание завершения всех асинхронных вызовов Ping.SendAsync»
textual
Листинг программы
- public async Task<string> Ping(int timeout, string ip)
- {
- Ping ping = new Ping();
- try
- {
- PingReply answer = await ping.SendPingAsync(ip, timeout);
- if (answer.Status == IPStatus.Success)
- {
- return answer.Address.ToString() + "|" + await GetMACAddress(answer.Address) + "|" + answer.RoundtripTime +
- "|" + Dns.GetHostEntry(answer.Address.ToString()).HostName;
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- return "";
- }
- public async Task<string> GetMACAddress(IPAddress ip)
- {
- return await Task.Run(() =>
- {
- byte[] macAddr = new byte[6];
- uint macAddrLen = (uint)macAddr.Length;
- try
- {
- SendARP(BitConverter.ToInt32(ip.GetAddressBytes(), 0), 0, macAddr, ref macAddrLen);
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- string[] sMacAddress = new string[(int)macAddrLen];
- for (int i = 0; i < macAddrLen; i++)
- {
- sMacAddress[i] = macAddr[i].ToString("x2");
- }
- return string.Join(":", sMacAddress).ToUpper();
- });
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д