C#Ping不够快

C#Ping不够快,c#,asynchronous,timeout,ping,C#,Asynchronous,Timeout,Ping,我正在尝试扫描电脑是联机还是脱机。 但我目前的代码扫描速度很慢,性能很好,就好像电脑离线一样,延迟3到5秒。 我甚至添加了设置为500的超时参数,但如果计算机处于脱机状态,仍然需要3秒钟以上的时间 public bool PingComputer(string computername) { bool check = false; Ping ping = new Ping(); try { PingR

我正在尝试扫描电脑是联机还是脱机。 但我目前的代码扫描速度很慢,性能很好,就好像电脑离线一样,延迟3到5秒。 我甚至添加了设置为500的超时参数,但如果计算机处于脱机状态,仍然需要3秒钟以上的时间

public bool PingComputer(string computername)
    {
        bool check = false;
        Ping ping = new Ping();
        try
        {
            PingReply reply = ping.Send(computername, 500);
            check = reply.Status == IPStatus.Success;
        }
        catch (PingException)
        {

        }
        return check;
    }
我也读过关于异步ping的文章,但是我还没有找到一个合适的解决方案,如果计算机在线,它会返回true;如果计算机离线,它会返回false

public bool PingComputer(string computername)
    {
        bool check = false;
        Ping ping = new Ping();
        try
        {
            PingReply reply = ping.Send(computername, 500);
            check = reply.Status == IPStatus.Success;
        }
        catch (PingException)
        {

        }
        return check;
    }

提前感谢。

如果你假装Ping一个计算机列表,你可以使用
并行
或使用异步
任务

我用同样的77个IP测试了下面两种方法。使用的变量
sec=3

  • 任务时间:00:00:02.7146249
  • 平行托克00:00:05.9941404
使用这些方法

Dictionary<string, bool> pingsReturn = await Network.PingListAsync(dictionary,3);
Dictionary pingsReturn=wait Network.PingListAsync(Dictionary,3);
我可以给你举两个例子:

任务
公共静态异步任务PingListAsync(字典主机列表,int-sec=3)
{
//创建一个包含32字节数据的缓冲区以进行传输。
string data=“aaaaaaaaaaaaaaaaaaaaaaaaaa”;
byte[]buffer=Encoding.ASCII.GetBytes(数据);
//设置一个快速TTL
PingOptions=新的PingOptions(20,true);
//处理Ping异常(如“找不到主机”)的内部支持任务
异步任务PingHost(字符串主机)
{
尝试
{
var pingresult=wait Task.Run(()=>new Ping().SendPingAsync(主机,秒*1000,缓冲区,选项));
//t、 等待();
if(pingresult.Status==IPStatus.Success)
返回新的KeyValuePair(主机,true);
其他的
返回新的KeyValuePair(主机,false);
}
抓住
{
返回新的KeyValuePair(主机,false);
}
}
//使用任务>>
var watch=新秒表();
watch.Start();
var tasksb=HostList.Select(HostName=>PingHost(HostName.Key.ToString());
var pinglist=wait Task.WhenAll(tasksb);
foreach(pinglist中的var pingreply)
{
HostList[pingreply.Key]=pingreply.Value;
}
看,停;
Log.Debug(“PingList(任务)运行时间:“+watch.appeased”);
//使用任务>
手表=新秒表();
watch.Start();
//“避免异常”集合已修改;枚举操作可能无法执行
//我们需要新的字典和附加值
字典=新字典();
Parallel.ForEach(HostList.Keys,(currHost)=>
{
尝试
{
var pingReply=new Ping().Send(currHost,sec*1000,buffer,options);
if(pingReply.Status==IPStatus.Success)
dictionary.Add(currHost,true);
其他的
dictionary.Add(currHost,false);
}
抓住
{
//处理Ping异常,如“找不到主机”
dictionary.Add(currHost,false);
}
});
看,停;
Log.Debug(“PingList(并行)运行时间:“+watch.appeased”);

//使用并行是因为您一次只检查一台计算机而导致代码太慢吗?如果不是,为什么不执行并行foreach?如果仍然不是这样,请创建您自己的ping类,该类不会尝试重新尝试,并在短的tcp连接超时时返回false。请查看以下内容:您正在ping多少台计算机计算机计算机计算机计算机名称需要DNS转换为IP地址。如果确实希望加快DNS结果的速度,则应缓存DNS结果。如果尚未了解DNS和ICMP协议,请学习。您需要更好的“联机”定义.Ping可能适用于一个IP地址,但不适用于另一个IP地址,具体取决于防火墙设置。它可能适用于系统名称,但不适用于其地址,具体取决于DNS服务器。当HTTP工作时,它可能根本不工作,同样取决于防火墙设置。我建议检查更具体的内容,如访问特定站点