当前位置: 首页 > 编程语言 > C#

如何使用C#并行执行多个“Ping”分享

时间:2023-04-10 13:37:00 C#

如何使用C#并行执行多个“Ping”我正在尝试计算一组服务器的平均往返时间。为了加快速度,我想并行执行ping。我写了一个叫做AverageRoundtripTime()的函数,但它似乎可以工作,因为我对多线程了解不多,我想知道我在做什么是否可以。请看我的代码,让我知道它是否正常,或者是否有更好的方法来实现我想要的:publicvoidMain(){//Collectionofhosts.列出主机=newList();//向集合中添加100个主机。对于(Int32i=0;i<100;++i)hosts.Add("www.google.com");//显示100台主机的平均往返时间。Console.WriteLine(AverageRoundtripTime(hosts));}publicDoubleAverageRoundtripTime(IEnumerablehosts){//线程集合。列出线程=newList();//ping回复的集合。列出pingReplies=newList();//遍历所有主机名。foreach(varhostinhosts){//创建一个新线程。Threadthread=newThread(()=>{//保存ping回复的变量。PingReplyreply=null;//创建一个新的Ping对象,并确保它在我们完成处理后//被释放。使用(Pingping=newPing()){reply=ping.Send(host);}//获取pingReplies集合的独占锁。lock(pingReplies){//添加ping回复到集合。pingReplies.Add(回复);}});//将新创建的线程添加到theads集合中。线程。添加(线程);//启动线程。线。开始();}//等待所有线程完成foreach(Threadthreadinthreads){thread.Join();}//计算并返回平均往返时间。返回pingReplies.Average(x=>x.RoundtripTime);}更新:查看我问的相关问题:任务并行库代码在Windows窗体应用程序中冻结-作为Windows控制台应用程序工作正常ping类有一个SendAsync方法这遵循基于事件的异步编程(EAP)模式。查看这篇文章:http://msdn.microsoft.com/en-us/library/ee622454.aspx。这是一个简单的例子,我有一个以非常基本的方式实现这篇文章的方法。您基本上可以根据需要多次调用它,并且所有ping都将异步完成。类程序{publicstaticstring[]addresses={"microsoft.com","yahoo.com","google.com"};staticvoidMain(string[]args){ListpingTasks=newList>();foreach(地址中的var地址){pingTasks.Add(PingAsync(address));}//等待所有任务完成Task.WaitAll(pingTasks.ToArray());//现在您可以遍历您的pingTasks列表foreach(varpingTaskinpingTasks){//pingTask.Result是在PingAsync中声明的任何类型TConsole.WriteLine(pingTask.Result.RoundtripTime);}控制台.ReadLine();}staticTaskPingAsync(字符串地址){vartcs=newTaskCompletionSource();平平=新平();ping.PingCompleted+=(obj,sender)=>{tcs.SetResult(sender.Reply);};ping.SendAsync(地址,新对象());返回tcs.Task;}}使用Parallel.For和ConcurrentBagstaticvoidMain(string[]args){Console.WriteLine(AverageRoundTripTime("www.google.com",100));Console.WriteLine(AverageRoundTripTime("www.stackoverflow.com",100));Console.ReadKey();}staticdoubleAverageRoundTripTime(stringhost,intsampleSize){ConcurrentBagvalues=newConcurrentBag();Parallel.For(1,sampleSize,(x,y)=>值。Add(Ping(host)));returnvalues.Sum(x=>x)/sampleSize;}staticdoublePing(stringhost){varreply=newPing().Send(host);if(reply!=null复制代码)returnreply.RoundtripTime;thrownewException("denied");}//使用LINQ解决方案变得更简单了Listhosts=newList();for(Int32i=0;inewPing().Send(h).RoundtripTime).Average();Console.WriteLine(average)也可能像这样使用SendPingAsync:using(varping=newPing()){varreplies=awaitTask.WhenAll(hosts.Select(x=>ping.SendPingAsync(x))).ConfigureAwait(false);//falsehere^unlessyouwanttoschedulebacktosynccontext...processreplies.}一个方法:internalclassUtils{internalstaticPingReplyPing(IPAddressaddress,inttimeout=1000,intttl=64){PingReplytpr=null;varp=newPing();try{tpr=p.Send(地址,超时,编码。ASCII。GetBytes(“oooooooooooooooooooooooooooooooooooo”),新的PingOptions(ttl,true));}catch(Exceptionex){tpr=null;}finally{if(p!=null)p.Dispose();p=空;}返回tpr;}internalstaticListPingAddresses(Listaddresses,inttimeout=1000,intttl=64){varret=addresses.Select(p=>Ping(p,timeout,ttl)).Where(p=>p!=null).Where(p=>p.Status==IPStatus.Success).Select(p=>p).ToList();返还;}internalstaticTaskPingAddressesAsync(Listaddresses,Action>endOfPing,inttimeout=1000,intttl=64){returnTask.Factory.StartNew>(()=>Utils.PingAddresses(addresses,timeout,ttl)).ContinueWith(t=>endOfPing(t));}}并使用:以上是C#学习教程:如何使用C#并行执行多个“Ping”。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——Console。WriteLine("开始");工具。PingAddressesAsync(newList(){IPAddress.Parse("192.168.1.1"),IPAddress.Parse("192.168.1.13"),IPAddress.Parse("192.168.1.49"),IPAddress.Parse("192.168.1.200")},delegate(Tasktpr){varlr=tpr.Result;Console.WriteLine("完成"+lr.Count.ToString()+"找到机器");foreach(varprinlr){Console.WriteLine(pr.Address.ToString());}});Console.WriteLine("执行");Console.ReadLine();本文收集自网络,不代表立场,如有侵权请点右联系管理员删除。如需转载请注明出处: