Een asynchrone query uitvoeren met behulp van System.Management

Als u een asynchrone query wilt uitvoeren op een WMI-naamruimte (Windows Instrumentation) van een Configuration Manager-client, maakt u een ManagementObjectSearcher object dat een WQL-query specificeert. Vervolgens maakt u een ManagementOperationObserver label waarin een gebeurtenis-handler wordt opgegeven voor elk queryresultaat en ook voor het einde van de query.

De asynchrone query wordt uitgevoerd wanneer de methode Get van het ManagementObjectSearcher object met het ManagementOperationObserver object wordt aangeroepen.

Een asynchrone query uitvoeren

  1. Stel een verbinding in met de WMI-naamruimte van de Configuration Manager-client. Zie Verbinding maken met de WMI-naamruimte van de Configuration Manager-client met behulp van System.Management.

  2. Een ManagementObjectSearcher object maken.

  3. Een ManagementOperationObserver object maken.

  4. Voeg een ObjectReadyEventHandler methode toe aan het ManagementOperationObserver object.

  5. CompletedEventHandler Een methode toevoegen aan het .ManagementOperationObserver

  6. Roep de ophaalmethode van het ManagementObjectSearcher object aan en geef het ManagmentOperationObserver object op als een parameter.

  7. Zorg ervoor dat uw toepassing nog steeds wordt uitgevoerd terwijl de query wordt uitgevoerd.

Voorbeeld

In het volgende C#-codevoorbeeld wordt asynchroon een query uitgevoerd voor onderdelen die op een client zijn geïnstalleerd.

Zie Een WMI-klassemethode aanroepen met System.Management voor informatie over het aanroepen van de voorbeeldcode.


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

Deze voorbeeldmethode heeft de volgende parameters:

Parameter Type Beschrijving
Scope ManagementScope Een geldige ManagementScope. Het pad moet root\ccm zijn.

De code compileren

Naamruimten

Systeem.

System.Management.

bijeenkomst

System.Management.

Robuust programmeren

De uitzondering die kan worden verhoogd is System.Management.ManagementException.

Zie ook

Over Configuration Manager WMI-programmering
Een WMI-klassemethode aanroepen met System.Management
Verbinding maken met de WMI-naamruimte van de Configuration Manager-client met behulp van System.Management
Een synchrone query uitvoeren met behulp van System.Management
Een WMI-object lezen met System.Management