日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發(fā)布時間:2025/4/16 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#-异步Ping检查网络通断 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在一個局域網(wǎng)中,需要檢查所有機器是否能Ping通

System.Net.NetworkInformation.Ping類提供了幾個方法:

  • Send :同步方式發(fā)送一個ICMP數(shù)據(jù)包,返回PingReply
  • SendPingAsync:異步方式發(fā)送ICMP數(shù)據(jù)包,返回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之間是串行執(zhí)行,效率也低

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:多個線程同時發(fā)送異步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)使用匿名函數(shù)構(gòu)造async/awaitFunc<Task> lambda = async () =>{await Task.WhenAll(tasks);}; (2)獲取返回值 Console.WriteLine(tasks.ElementAt(0).Result.Status);

說明:

(1)List集合以及數(shù)組的擴展方法Select方法快速實現(xiàn)獲取合中某個屬性的所有值,此方法避免了自己寫for循環(huán)或者foreach遍歷的循環(huán)語句。

(2)用循環(huán)創(chuàng)建了一個tasks集合,使用SendPingAsync異步方式Ping主機,避免阻塞主線程。

(2)關(guān)鍵步驟是使用Task.WhenAll,會根據(jù)tasks集合,自動創(chuàng)建Task執(zhí)行,并等待所有任務(wù)完成后,才結(jié)束。再執(zhí)行后面的操作。

總結(jié)

以上是生活随笔為你收集整理的C#-异步Ping检查网络通断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。