Een asynchrone query uitvoeren met system.management
Als u een asynchrone query wilt uitvoeren op een Configuration Manager WMI-naamruimte (Windows Instrumentation), maakt u een ManagementObjectSearcher
object dat een WQL-query opgeeft. Vervolgens maakt u een ManagementOperationObserver
die een gebeurtenis-handler opgeeft voor elk queryresultaat en ook voor het einde van de query.
De asynchrone query wordt uitgevoerd wanneer de methode Get met het ManagementObjectSearcher
ManagementOperationObserver
object wordt aangeroepen.
Een asynchrone query uitvoeren
Een verbinding instellen met de WMI-naamruimte van de Configuration Manager-client. Zie How to Connect to the Configuration Manager Client WMI Namespace by Using System.Management (Verbinding maken met de WMI-naamruimte van de Configuration Manager-client met behulp van System.Management) voor meer informatie.
Maak een
ManagementObjectSearcher
object.Maak een
ManagementOperationObserver
object.Voeg een
ObjectReadyEventHandler
methode toe aan hetManagementOperationObserver
object.Voeg een
CompletedEventHandler
methode toe aan deManagementOperationObserver
.Roep de methode Get aan
ManagementObjectSearcher
en geef hetManagmentOperationObserver
object op als parameter.Zorg ervoor dat uw toepassing nog steeds wordt uitgevoerd terwijl de query wordt uitgevoerd.
Voorbeeld
In het volgende C#-codevoorbeeld worden asynchroon query's uitgevoerd op onderdelen die op een client zijn geïnstalleerd.
Zie How to Call a WMI Class Method by Using System.Management (Een WMI-klassemethode aanroepen met behulp van System.Management) voor meer 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.
Vergadering
System.Management.
Robuust programmeren
De uitzondering die kan worden gegenereerd, 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 System.Management
Een WMI-object lezen met System.Management