0

次の 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:

なぜこれを考えなかったのかわかりません (それでも問題にはなりませんが): デバッグ中に VS のイミディエイト ウィンドウからこのコードを呼び出していました。このコードを Windows フォーム ボタンにリンクすると、すべてが正常に機能したため、何らかのスレッドの問題が発生したに違いありません。助けてくれてありがとう!!

4

2 に答える 2

0

ManagementClassコンストラクター(ManagementScopeオブジェクトの代わりに文字列スコープを使用)を使用する場合にも同じ問題がありますか?

(したがって、ManagementScopeステップ全体をスキップします)

于 2009-07-14T18:38:01.027 に答える
0

デバッグ中にイミディエイト ウィンドウから WMI クエリを実行することは明らかに禁止されています。代わりに、ボタンを押した結果としてクエリを実行すると、問題が修正されました。

于 2009-09-08T00:47:07.697 に答える