C#-异步Ping检查网络通断
生活随笔
收集整理的這篇文章主要介紹了
C#-异步Ping检查网络通断
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在一個(gè)局域網(wǎng)中,需要檢查所有機(jī)器是否能Ping通
System.Net.NetworkInformation.Ping類提供了幾個(gè)方法:
- Send :同步方式發(fā)送一個(gè)ICMP數(shù)據(jù)包,返回PingReply
- SendPingAsync:異步方式發(fā)送ICMP數(shù)據(jù)包,返回Task<PingReply>
?
方式1:同步方式(主程序與Ping命令同步,多個(gè)Ping以同步方式運(yùn)行)
此時(shí),界面會(huì)阻塞,無法使用
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:每個(gè)Ping以異步方式
此時(shí),界面不會(huì)阻塞,但每個(gè)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:多個(gè)線程同時(shí)發(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);補(bǔ)充: (1)使用匿名函數(shù)構(gòu)造async/awaitFunc<Task> lambda = async () =>{await Task.WhenAll(tasks);}; (2)獲取返回值 Console.WriteLine(tasks.ElementAt(0).Result.Status);說明:
(1)List集合以及數(shù)組的擴(kuò)展方法Select方法快速實(shí)現(xiàn)獲取合中某個(gè)屬性的所有值,此方法避免了自己寫for循環(huán)或者foreach遍歷的循環(huán)語句。
(2)用循環(huán)創(chuàng)建了一個(gè)tasks集合,使用SendPingAsync異步方式Ping主機(jī),避免阻塞主線程。
(2)關(guān)鍵步驟是使用Task.WhenAll,會(huì)根據(jù)tasks集合,自動(dòng)創(chuàng)建Task執(zhí)行,并等待所有任務(wù)完成后,才結(jié)束。再執(zhí)行后面的操作。
總結(jié)
以上是生活随笔為你收集整理的C#-异步Ping检查网络通断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用puppeteer爬 EXTJS
- 下一篇: C# UI界面的更新