Como executar uma consulta assíncrona usando System.Management

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

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

Para executar uma consulta assíncrona

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

  2. Criar um ManagementObjectSearcher objeto.

  3. Criar um ManagementOperationObserver objeto.

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

  5. Adicione um CompletedEventHandler método ao ManagementOperationObserver.

  6. Chame o ManagementObjectSearcher método Get do 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 de forma assíncrona 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 domínio .ManagementScope O caminho deve ser root\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 a programação WMI do Configuration Manager
Como chamar um método de classe WMI usando System.Management
Como se conectar ao namespace WMI do cliente do Configuration Manager usando System.Management
Como executar uma consulta síncrona usando System.Management
Como ler um objeto WMI usando System.Management