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

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

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

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

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());
            }
        }
Можно отсылать синхронные запросы, но ето будет слишком медленно. В примерах MSDN использовался

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();
            });        
        }

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


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

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

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