为什么这个WMI查询第二次被挂起?

问题描述:

sqlHost是一个无效的服务器名称时,以下WMI查询在serverProtocolsManagement.Get()处抛出异常(如预期的那样)但如果我尝试再次调用此代码并使用相同的无效参数,ManagementScope构造函数将无限期地挂起(永远不会返回或抛出错误,只是挂)是否有这样一个合理的解释为什么这个WMI查询第二次被挂起?

try { 

     ManagementScope managementScope = new ManagementScope(@"\\" + sqlHost + @"\root\Microsoft\SqlServer\ComputerManagement"); 
     using (ManagementClass serverProtocolsManagement = new ManagementClass(managementScope, new ManagementPath("ServerNetworkProtocol"), null)) { 

      serverProtocolsManagement.Get(); 

      using (ManagementObjectCollection protocols = serverProtocolsManagement.GetInstances()) { 
       foreach (ManagementObject protocol in protocols) { 
        protocol.Get(); 

        if ((string)protocol.GetPropertyValue("ProtocolName") == "Tcp" && 
         (string)protocol.GetPropertyValue("InstanceName") == sqlInstanceName) { 

         protocol.InvokeMethod("SetEnable", null); 
        } 
       } 
      } 
     } 
    } catch (COMException ex) { 
     MessageBox.Show(ex.ToString()); 
    } 

编辑:?

我试着用不同的超时选项乱搞(通过传递ConnectionOptions对象到ManagementScope构造函数),但是 徒劳无功。

编辑#2:

我不知道为什么我没有想到这一点(虽然它仍然不应该是一个问题):我打电话从即时窗口中VS这段代码同时调试。一定有某种线程问题,因为一旦我将这些代码链接到一个Windows窗体按钮,一切正常。谢谢您的帮助!!

显然运行从即时窗口WMI查询而调试是一个没有没有。由于按下按钮而执行查询,而不是解决问题。

当您使用ManagementClass构造函数(使用字符串作用域而不是ManagementScope对象)时,是否也有同样的问题?

(为此跳过整个管理范围工序)

+0

我试过你的建议,是的,我有同样的问题。我也有使用ManagementObjectSearcher对象而不是ManagementClass对象的相同问题。很奇怪... – Pwninstein 2009-07-14 19:09:22