为什么这个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对象)时,是否也有同样的问题?
(为此跳过整个管理范围工序)
我试过你的建议,是的,我有同样的问题。我也有使用ManagementObjectSearcher对象而不是ManagementClass对象的相同问题。很奇怪... – Pwninstein 2009-07-14 19:09:22