我需要以最快的方式检查远程计算机是否关闭。我尝试过一些方法,但没有一种方法能给我所需的时间速度(它应该小于0.5秒,这很重要,因为在上下文菜单弹出窗口中会出现)
//using System.Net
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostName);
//if error occurs - remote computer is off
//using System.Net.NetworkInformation
Ping ping = new Ping();
PingReply pingReply = ping.Send(hostIp);
if (pingReply.Status != IPStatus.Success)
{
//Remote computer is off
}
//using System.Management
ManagementScope scope = new ManagementScope(@"\\" + hostName + @"\root\cimv2", null);
scope.Connect();
//if error occurs - remote computer is off
据我所知,最快的方法是使用Dns.GetHostEntry(hostName) - 但它仍然需要大约3秒才能抛出异常。 有什么想法吗?
答案 0 :(得分:1)
使用Ping with timeout。此版本的Send方法将允许您指定等待响应的时间。如果您定义500毫秒并且您正在检查的服务器不在地球的另一端或非常高延迟的Internet连接上,您可以非常可靠地说目标计算机已关闭或您的Internet连接出现问题。
Dns.GetHostEntry不会检查主机是启动还是关闭。这适用于DNS,只尝试解析主机名。即使主机名存在且只是使用的DNS服务器没有响应,DNS也可能很慢并且可能会超时。
答案 1 :(得分:1)
鉴于它只适用于一台计算机,为什么不在单独的线程上运行您的答案逻辑并缓存计算机的状态?您的上下文弹出窗口将从此缓存中读取并“即时”响应,但确切的状态可能会延迟几秒......现在,取决于您之后使用计算机做什么(您在答案中未提及),这可能是一种考虑......
的方法答案 2 :(得分:0)
因为你依赖于很多因素(网络负载,数据包丢失等),此外,当计算机在收到请求时没有立即响应时并不一定说它在线,你不能假设电脑处于离线状态。 我认为你不能比ping请求更快地完成它。