C#-异步Ping检查网络通断

在一个局域网中,需要检查所有机器是否能Ping通

System.Net.NetworkInformation.Ping类提供了几个方法:

  • Send :同步方式发送一个ICMP数据包,返回PingReply
  • SendPingAsync:异步方式发送ICMP数据包,返回Task<PingReply>

方式1:同步方式(主程序与Ping命令同步,多个Ping以同步方式运行)

此时,界面会阻塞,无法使用

for (int i = 1; i < 254; i++) {
                PingReply reply1 =  p1.Send("10.127.0."+i.ToString());
                Console.WriteLine("10.127.0." + i.ToString()+":"+reply1.Status.ToString());
  }

方式2:每个Ping以异步方式

此时,界面不会阻塞,但每个Ping之间是串行执行,效率也低

public async  void test(){
 for (int i = 1; i < 254; i++)
            {
                PingReply reply1 = await p1.SendPingAsync("10.127.0."+i.ToString());
                Console.WriteLine("10.127.0." + i.ToString()+":"+reply1.Status.ToString());
            }
}

方式3:多个线程同时发送异步ping

 List<string> theListOfIPs = new List<string>();
  for (int i = 1; i < 254; i++)
         theListOfIPs.Add("10.127.0." + i.ToString());
var tasks = theListOfIPs.Select(ip =>
            {
                Ping pingSender = new Ping();
                return pingSender.SendPingAsync(ip, 2000);
            });
var results = await Task.WhenAll(tasks);

说明:

(1)List集合以及数组的扩展方法Select方法快速实现获取合中某个属性的所有值,此方法避免了自己写for循环或者foreach遍历的循环语句。

(2)用循环创建了一个tasks集合,使用SendPingAsync异步方式Ping主机,避免阻塞主线程。

(2)关键步骤是使用Task.WhenAll,会根据tasks集合,自动创建Task执行,并等待所有任务完成后,才结束。再执行后面的操作。

发布了22 篇原创文章 · 获赞 4 · 访问量 4838

猜你喜欢

转载自blog.csdn.net/guo1wu3shi4/article/details/95502983