我有以下代码检查远程计算机上的服务的状态.问题是,如果找不到远程计算机(它已关闭或其他东西),则该ManagementObjectSearcher.Get()
方法需要20秒才能抛出"RPC服务器不可用"错误.在服务器不可用的情况下,我想明确声明我只希望它在短时间内尝试(例如3秒).我在这里发布了帖子,但它声明在ManagementObjectSearcher上使用Timeout选项,但我的代码似乎忽略了该值(因为它表明它与集合无关).我有什么东西可以忽略这些选项吗?我尝试过使用该ReturnImmediatly
物业也无济于事.
public static void WmiServiceCheck() { try { var computerName = "SomeInvalidComputer"; var serviceName = "Power"; var managementScope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", computerName)); var objectQuery = new ObjectQuery(string.Format("SELECT * FROM Win32_Service WHERE Name = '{0}'", serviceName)); var searcher = new ManagementObjectSearcher(managementScope, objectQuery); searcher.Options.Timeout = new TimeSpan(0, 0, 0, 3); // Timeout of 3 seconds var managementObjectCollection = searcher.Get(); var serviceState = managementObjectCollection.Cast().ToList().Single()["State"].ToString(); /// Other stuff here } catch (Exception ex) { } }
Hans Passant.. 8
是的,不是那个.您想要设置ConnectionOptions.Timeout:
var managementScope = new ManagementScope(...); managementScope.Options.Timeout = TimeSpan.FromSeconds(3);
我测试时工作得很好.
请记住,3秒是在低端,服务器可能必须将大量代码交换到RAM中以处理请求,如果有一段时间没有查询.如果服务器以其他方式保留磁盘驱动器hoppin',则不一定是快速操作.如果您不介意偶尔的误报,请选择它.我个人从来没有在工作站上低于10秒,在Hard Knocks学校学习.服务器类机器20秒是安全的.
是的,不是那个.您想要设置ConnectionOptions.Timeout:
var managementScope = new ManagementScope(...); managementScope.Options.Timeout = TimeSpan.FromSeconds(3);
我测试时工作得很好.
请记住,3秒是在低端,服务器可能必须将大量代码交换到RAM中以处理请求,如果有一段时间没有查询.如果服务器以其他方式保留磁盘驱动器hoppin',则不一定是快速操作.如果您不介意偶尔的误报,请选择它.我个人从来没有在工作站上低于10秒,在Hard Knocks学校学习.服务器类机器20秒是安全的.