Следующий запрос WMI вызывает исключение на serverProtocolsManagement.Get()
, когда sqlHost
является недопустимым именем сервера (как и ожидалось. Однако, если я попытаюсь снова вызвать этот код с тем же недопустимым параметром, конструктор ManagementScope
зависнет на неопределенное время (никогда не возвращает или выдает ошибку, просто зависает.) Есть ли разумное объяснение этому?
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());
}
Edit:
Я пытался возиться с различными вариантами таймаута (передавая объект ConnectionOptions
в конструктор ManagementScope
), но безрезультатно.
Редактировать № 2:
Я не знаю, почему я не подумал об этом (хотя это все еще не должно быть проблемой): я вызывал этот код из Immediate Window в VS во время отладки. Должно быть, возникла какая-то проблема с многопоточностью, потому что, как только я связал этот код с кнопкой Windows Forms, все заработало просто отлично. Спасибо за помощь !!