Como executar uma consulta assíncrona usando System.Management

Para executar uma consulta assíncrona em um namespace da WMI (Instrumentação do Windows) do cliente Configuration Manager, crie um ManagementObjectSearcher objeto que especifica uma consulta WQL. Em seguida, você cria um ManagementOperationObserver que especifica um manipulador de eventos para cada resultado de consulta e também para o final da consulta.

A consulta assíncrona é executada quando o método Get do ManagementObjectSearcher objeto é chamado com o ManagementOperationObserver objeto.

Para executar uma consulta assíncrona

  1. Configure uma conexão com o namespace WMI do cliente Configuration Manager. Para obter mais informações, consulte Como se conectar ao namespace WMI do cliente Configuration Manager usando System.Management.

  2. Crie um ManagementObjectSearcher objeto.

  3. Crie um ManagementOperationObserver objeto.

  4. Adicione um ObjectReadyEventHandler método ao ManagementOperationObserver objeto.

  5. Adicione um CompletedEventHandler método ao ManagementOperationObserver.

  6. Chame o método Get do ManagementObjectSearcher objeto e forneça o ManagmentOperationObserver objeto como um parâmetro.

  7. Verifique se o aplicativo ainda é executado enquanto a consulta é executada.

Exemplo

O exemplo de código C# a seguir consulta assíncronamente para componentes instalados em um cliente.

Para obter informações sobre como chamar o código de exemplo, consulte Como chamar um método de classe WMI usando 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 exemplo tem os seguintes parâmetros:

Parâmetro Tipo Descrição
Scope ManagementScope Um válido ManagementScope. O caminho deve ser raiz\ccm.

Compilando o código

Namespaces

Sistema.

System.Management.

Assembly

System.Management.

Programação robusta

A exceção que pode ser gerada é System.Management.ManagementException.

Confira também

Sobre Configuration Manager programação WMI
Como chamar um método de classe WMI usando System.Management
Como conectar-se ao namespace WMI do cliente Configuration Manager usando System.Management
Como executar uma consulta síncrona usando System.Management
Como ler um objeto WMI usando System.Management