如何使用 System.Management 执行异步查询

若要对 Configuration Manager 客户端 Windows Instrumentation (WMI) 命名空间执行异步查询,请创建一个ManagementObjectSearcher指定 WQL 查询的对象。 然后,创建一个 , ManagementOperationObserver 它为每个查询结果指定事件处理程序,并为查询末尾指定事件处理程序。

使用 对象调用ManagementOperationObserver对象 Get 方法时ManagementObjectSearcher,将运行异步查询。

执行异步查询

  1. 设置与Configuration Manager客户端 WMI 命名空间的连接。 有关详细信息,请参阅如何使用 System.Management 连接到 Configuration Manager 客户端 WMI 命名空间

  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;  
}  

此示例方法具有以下参数:

参数 类型 说明
Scope ManagementScope 有效的 ManagementScope。 路径应为 root\ccm。

编译代码

命名空间

系统。

System.Management。

Assembly

System.Management。

可靠编程

可以引发的异常是 System.Management.ManagementException

另请参阅

关于Configuration Manager WMI 编程
如何使用 System.Management 调用 WMI 类方法
如何使用 System.Management 连接到 Configuration Manager 客户端 WMI 命名空间
如何使用 System.Management 执行同步查询
如何使用 System.Management 读取 WMI 对象