Асинхронный пинг списка адресов - C#
Формулировка задачи:
C# изучаю недавно, возникла потребность решить одну задачу.
Суть задачи:
Программа получает список доменов, пингует его, все "живые домены" пихает в один файл, оставшиеся "мертвые" - в другой.
Есть работающая функция, но работает она достаточно медленно:
Возникло желание перевести эту функцию под асинхронный пинг. В интернете нарыл следующее решение:
Как заставить функцию PingUrl возвращать true, если домен пингуется или false, если пинг не прошел?
За кривой код прошу не унижать, ведь это не коммерческий проект, а небольшая утилитка для собственного пользования, которую я пишу чтобы хоть как-то освоить этот язык.
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; }
Решение задачи: «Асинхронный пинг списка адресов»
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 += "Пусто"; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д