当RPC服务器不可用时,在远程WMI上设置超时

big*_*mac 5 c# wmi timeout

我有以下代码检查远程计算机上的服务的状态.问题是,如果找不到远程计算机(它已关闭或其他东西),则该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<ManagementObject>().ToList().Single()["State"].ToString();
            /// Other stuff here
        }
        catch (Exception ex)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 8

是的,不是那个.您想要设置ConnectionOptions.Timeout:

  var managementScope = new ManagementScope(...);
  managementScope.Options.Timeout = TimeSpan.FromSeconds(3);
Run Code Online (Sandbox Code Playgroud)

我测试时工作得很好.

请记住,3秒是在低端,服务器可能必须将大量代码交换到RAM中以处理请求,如果有一段时间没有查询.如果服务器以其他方式保留磁盘驱动器hoppin',则不一定是快速操作.如果您不介意偶尔的误报,请选择它.我个人从来没有在工作站上低于10秒,在Hard Knocks学校学习.服务器类机器20秒是安全的.