System.Management を使用して非同期クエリを実行する方法

Configuration Manager クライアント Windows Instrumentation (WMI) 名前空間で非同期クエリを実行するには、WQL クエリをManagementObjectSearcher指定するオブジェクトを作成します。 その後、クエリ結果ごとにイベント ハンドラーを指定し、クエリの最後にも を指定する を作成 ManagementOperationObserver します。

非同期クエリは、オブジェクト Get メソッドが ManagementObjectSearcher オブジェクトと共に ManagementOperationObserver 呼び出されたときに実行されます。

非同期クエリを実行するには

  1. Configuration Manager クライアント WMI 名前空間への接続を設定します。 詳細については、「System.Management を使用してConfiguration Manager クライアント WMI 名前空間に接続する方法」を参照してください。

  2. オブジェクトを ManagementObjectSearcher 作成します。

  3. オブジェクトを ManagementOperationObserver 作成します。

  4. オブジェクトに ObjectReadyEventHandler メソッドを ManagementOperationObserver 追加します。

  5. メソッドを CompletedEventHandler に追加します ManagementOperationObserver

  6. オブジェクト Get メソッドを ManagementObjectSearcher 呼び出し、オブジェクトを ManagmentOperationObserver パラメーターとして指定します。

  7. クエリの実行中にアプリケーションが引き続き実行されていることを確認します。

次の 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 オブジェクトを読み取る方法