次の 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 フォーム ボタンにリンクすると、すべてが正常に機能したため、何らかのスレッドの問題が発生したに違いありません。助けてくれてありがとう!!