Асинхронный пинг списка адресов - C#

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

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

C# изучаю недавно, возникла потребность решить одну задачу. Суть задачи: Программа получает список доменов, пингует его, все "живые домены" пихает в один файл, оставшиеся "мертвые" - в другой. Есть работающая функция, но работает она достаточно медленно:
 
private bool PingUrl(string URL, int pingTimeOut)
{
try
            {
                Ping pingSender = new Ping();
                PingReply pingReply = null;
 
                pingReply = pingSender.Send(URL, pingTimeOut);
                
                if (pingReply.Status != IPStatus.TimedOut)
                {                    
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {               
                return false;
            }
}
Возникло желание перевести эту функцию под асинхронный пинг. В интернете нарыл следующее решение:
private bool PingUrl(string URL, int pingTimeOut)
        {
            try
            {
                AutoResetEvent waiter = new AutoResetEvent(false);
 
                Ping pingSender = new Ping();
 
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                PingOptions options = new PingOptions(64, true);
 
                pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
 
                pingSender.SendAsync(URL, pingTimeOut, buffer, options, waiter);
 
                waiter.WaitOne();
                
            }
            catch (Exception)
            {
                return false;
            }
        }
 
        private static void PingCompletedCallback(object sender, PingCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                ((AutoResetEvent)e.UserState).Set();
            }
 
            if (e.Error != null)
            {
                ((AutoResetEvent)e.UserState).Set();
            }
            
            PingReply reply = e.Reply;
 
            DisplayReply(reply);
 
            ((AutoResetEvent)e.UserState).Set();
        }
 
        public static bool DisplayReply(PingReply reply)
        {
            if (reply == null)
                return false;
            else if (reply.Status == IPStatus.Success)
            {
                return true;
            }
            else return false;
        }
Как заставить функцию PingUrl возвращать true, если домен пингуется или false, если пинг не прошел? За кривой код прошу не унижать, ведь это не коммерческий проект, а небольшая утилитка для собственного пользования, которую я пишу чтобы хоть как-то освоить этот язык.

Решение задачи: «Асинхронный пинг списка адресов»

textual
Листинг программы
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> goods = new List<string>();
            goods = Pings.PingMethod();            
 
            if (goods != null)
            {
                foreach (var item in goods)
                {
                    richTextBox1.Text += item;
                }
            }
            else
            {
                richTextBox1.Text += "Пусто";
            }
        }

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


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

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

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