共用方式為


如何使用 System.Management 執行非同步查詢

若要在Configuration Manager用戶端 Windows Instrumentation (WMI) 命名空間上執行非同步查詢,請建立 ManagementObjectSearcher 指定 WQL 查詢的 物件。 接著,您會建立 , ManagementOperationObserver 為每個查詢結果以及查詢結尾指定事件處理常式。

使用 物件呼叫 ManagementOperationObserver 物件 Get 方法時, ManagementObjectSearcher 會執行非同步查詢。

執行非同步查詢

  1. 設定與Configuration Manager用戶端 WMI 命名空間的連線。 如需詳細資訊,請參閱How to Connect to the Configuration Manager Client WMI Namespace by Using System.Management

  2. ManagementObjectSearcher建立 物件。

  3. ManagementOperationObserver建立 物件。

  4. ObjectReadyEventHandler將 方法新增至 ManagementOperationObserver 物件。

  5. CompletedEventHandler將 方法新增至 ManagementOperationObserver

  6. ManagementObjectSearcher呼叫物件 Get 方法, 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;  
}  

此範例方法具有下列參數:

參數 Type 描述
Scope ManagementScope 有效的 ManagementScope 。 路徑應該是 root\ccm。

正在編譯程式碼

命名空間

系統。

System.Management。

組件

System.Management。

健全的程式設計

可以引發的例外狀況是 System.Management.ManagementException

另請參閱

關於Configuration Manager WMI 程式設計
如何使用 System.Management 呼叫 WMI 類別方法
如何使用 System.Management 連線到 Configuration Manager 用戶端 WMI 命名空間
如何使用 System.Management 執行同步查詢
如何使用 System.Management 讀取 WMI 物件