Почему этот запрос WMI зависает при втором вызове?

Следующий запрос 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());
    }

Изменить:

Я пытался возиться с различными параметрами тайм-аута (путем передачи объекта ConnectionOptions конструктору ManagementScope), но безрезультатно.

Изменить №2:

Я не знаю, почему я не подумал об этом (хотя это все равно не должно быть проблемой): я вызывал этот код из Immediate Window в VS во время отладки. Должно быть, возникла какая-то проблема с потоками, потому что, как только я связал этот код с кнопкой Windows Forms, все заработало нормально. Спасибо за помощь!!


person Mark Carpenter    schedule 14.07.2009    source источник


Ответы (2)


У вас возникает та же проблема при использовании конструктора ManagementClass (со строковой областью вместо объекта ManagementScope)?

(чтобы пропустить весь шаг ManagementScope)

person Zyphrax    schedule 14.07.2009
comment
Я попробовал ваше предложение, и да, у меня та же проблема. У меня также есть такая же проблема с использованием объекта ManagementObjectSearcher вместо объекта ManagementClass. Очень странно... - person Mark Carpenter; 14.07.2009

По-видимому, выполнение запросов WMI из окна Immediate во время отладки недопустимо. Выполнение запроса в результате нажатия кнопки вместо этого устранило проблему.

person Mark Carpenter    schedule 08.09.2009