System.Management を使用して非同期クエリを実行する方法
Configuration Manager クライアント Windows Instrumentation (WMI) 名前空間で非同期クエリを実行するには、WQL クエリをManagementObjectSearcher
指定するオブジェクトを作成します。 その後、クエリ結果ごとにイベント ハンドラーを指定し、クエリの最後にも を指定する を作成 ManagementOperationObserver
します。
非同期クエリは、オブジェクト Get メソッドが ManagementObjectSearcher
オブジェクトと共に ManagementOperationObserver
呼び出されたときに実行されます。
非同期クエリを実行するには
Configuration Manager クライアント WMI 名前空間への接続を設定します。 詳細については、「System.Management を使用してConfiguration Manager クライアント WMI 名前空間に接続する方法」を参照してください。
オブジェクトを
ManagementObjectSearcher
作成します。オブジェクトを
ManagementOperationObserver
作成します。オブジェクトに
ObjectReadyEventHandler
メソッドをManagementOperationObserver
追加します。メソッドを
CompletedEventHandler
に追加しますManagementOperationObserver
。オブジェクト Get メソッドを
ManagementObjectSearcher
呼び出し、オブジェクトをManagmentOperationObserver
パラメーターとして指定します。クエリの実行中にアプリケーションが引き続き実行されていることを確認します。
例
次の C# コード例では、クライアントにインストールされているコンポーネントを非同期的にクエリします。
サンプル コードの呼び出しについては、「 System.Management を使用して WMI クラス メソッドを呼び出す方法」を参照してください。
public void EnumerateInstancesAsync(ManagementScope scope)
{
try
{
// Instantiate an object searcher with the query.
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, new
SelectQuery("CCM_InstalledComponent"));
// Create a results watcher object
// and handler for results and completion.
ManagementOperationObserver results = new
ManagementOperationObserver();
// Attach handler to events for results and completion.
results.ObjectReady += new
ObjectReadyEventHandler(this.NewObject);
results.Completed += new
CompletedEventHandler(this.Done);
Console.WriteLine("Installed Components");
Console.WriteLine("--------------------");
Console.WriteLine();
// Call the asynchronous overload of Get()
// to start the enumeration.
searcher.Get(results);
// Do something else while results
// arrive asynchronously.
while (!this.Completed)
{
System.Threading.Thread.Sleep(1000);
}
this.Reset();
}
catch (ManagementException e)
{
Console.WriteLine("Failed to run query: " + e.Message);
throw;
}
}
private bool isCompleted = false;
private void NewObject(object sender,
ObjectReadyEventArgs obj)
{
try
{
Console.WriteLine("Name: {0}, Version = {1}",
obj.NewObject["DisplayName"],
obj.NewObject["Version"]);
}
catch (ManagementException e)
{
Console.WriteLine("Error: " + e.Message);
}
}
private bool Completed
{
get
{
return isCompleted;
}
}
private void Reset()
{
isCompleted = false;
}
private void Done(object sender,
CompletedEventArgs obj)
{
isCompleted = true;
}
この例のメソッドには、次のパラメーターがあります。
パラメーター | 型 | 説明 |
---|---|---|
Scope |
ManagementScope |
有効な ManagementScope 。 パスは root\ccm にする必要があります。 |
コードのコンパイル
名前空間
システム。
System.Management。
Assembly
System.Management。
堅牢なプログラミング
発生できる例外は System.Management.ManagementException です。
関連項目
WMI プログラミングConfiguration Managerについて
System.Management を使用して WMI クラス メソッドを呼び出す方法
System.Management を使用してConfiguration Manager クライアント WMI 名前空間に接続する方法
System.Management を使用して同期クエリを実行する方法
System.Management を使用して WMI オブジェクトを読み取る方法