Come eseguire una query asincrona tramite System.Management

Per eseguire una query asincrona in uno spazio dei nomi WMI (Windows Instrumentation) del client di Configuration Manager, crea un ManagementObjectSearcher oggetto che specifica una query WQL. Viene quindi creato un ManagementOperationObserver gestore eventi per ogni risultato della query e anche per la fine della query.

La query asincrona viene eseguita quando il metodo Get dell'oggetto ManagementObjectSearcher viene chiamato con l'oggetto ManagementOperationObserver .

Per eseguire una query asincrona

  1. Configurare una connessione allo spazio dei nomi WMI del client di Configuration Manager. Per altre informazioni, vedi Come connettersi allo spazio dei nomi WMI del client di Configuration Manager tramite System.Management.

  2. Creare un ManagementObjectSearcher oggetto.

  3. Creare un ManagementOperationObserver oggetto.

  4. Aggiungere un ObjectReadyEventHandler metodo all'oggetto ManagementOperationObserver .

  5. Aggiungere un CompletedEventHandler metodo alla proprietà .ManagementOperationObserver

  6. Chiama il metodo Get dell'oggetto ManagementObjectSearcher e fornisci l'oggetto ManagmentOperationObserver come parametro.

  7. Assicurarsi che l'applicazione sia ancora in esecuzione durante l'esecuzione della query.

Esempio

Nell'esempio di codice C# seguente viene eseguita una query asincrona per i componenti installati in un client.

Per informazioni sulla chiamata del codice di esempio, vedere Come chiamare un metodo di classe WMI utilizzando 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;  
}  

Questo metodo di esempio include i parametri seguenti:

Parametro Tipo Descrizione
Scope ManagementScope Un valido ManagementScopefile . Il percorso deve essere root\ccm.

Compilazione del codice

Spazi dei nomi

Sistema.

System.Management.

Assembly

System.Management.

Programmazione efficiente

L'eccezione che può essere generata è System.Management.ManagementException.

Vedere anche

Informazioni sulla programmazione WMI di Configuration Manager
Come chiamare un metodo di classe WMI tramite System.Management
Come connettersi allo spazio dei nomi WMI del client di Configuration Manager tramite System.Management
Come eseguire una query sincrona tramite System.Management
Come leggere un oggetto WMI tramite System.Management