Cómo realizar una consulta asincrónica mediante System.Management

Para realizar una consulta asincrónica en un espacio de nombres de instrumental de Windows (WMI) de cliente de Configuration Manager, cree un ManagementObjectSearcher objeto que especifique una consulta WQL. A continuación, cree un ManagementOperationObserver controlador que especifique un controlador de eventos para cada resultado de la consulta y también para el final de la consulta.

La consulta asincrónica se ejecuta cuando se llama al ManagementObjectSearcher método Get del objeto con el ManagementOperationObserver objeto.

Para realizar una consulta asincrónica

  1. Configura una conexión al espacio de nombres WMI de cliente de Configuration Manager. Para obtener más información, consulta Cómo conectarse al espacio de nombres WMI de cliente de Configuration Manager mediante System.Management.

  2. Crear un ManagementObjectSearcher objeto.

  3. Crear un ManagementOperationObserver objeto.

  4. Agregue un ObjectReadyEventHandler método al ManagementOperationObserver objeto.

  5. Agregue un CompletedEventHandler método al ManagementOperationObserver.

  6. Llame al ManagementObjectSearcher objeto Get y proporcione el ManagmentOperationObserver objeto como parámetro.

  7. Asegúrese de que la aplicación se sigue ejecutando mientras se ejecuta la consulta.

Ejemplo

El siguiente ejemplo de código de C# consulta de forma asincrónica los componentes que están instalados en un cliente.

Para obtener información sobre cómo llamar al código de ejemplo, vea Cómo llamar a un método de clase WMI mediante System.Management.


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

Este método de ejemplo tiene los siguientes parámetros:

Parámetro Tipo Descripción
Scope ManagementScope Un ManagementScopearchivo . La ruta de acceso debe ser root\ccm.

Compilar el código

Espacios de nombres

sistema.

System.Management.

Ensamblado

System.Management.

Programación sólida

La excepción que se puede generar es System.Management.ManagementException.

Consulta también

Acerca de la programación WMI de Configuration Manager
Cómo llamar a un método de clase WMI mediante System.Management
Cómo conectarse al espacio de nombres WMI de cliente de Configuration Manager mediante System.Management
Cómo realizar una consulta sincrónica mediante System.Management
Cómo leer un objeto WMI mediante System.Management