Come eseguire una query asincrona usando System.Management
Per eseguire una query asincrona in uno spazio dei nomi WMI (Windows Instrumentation) client Configuration Manager, creare un ManagementObjectSearcher
oggetto che specifica una query WQL. Si crea quindi un oggetto ManagementOperationObserver
che specifica un gestore eventi per ogni risultato della query e anche per la fine della query.
La query asincrona viene eseguita quando viene chiamato il ManagementObjectSearcher
metodo Get dell'oggetto con l'oggetto ManagementOperationObserver
.
Per eseguire una query asincrona
Configurare una connessione allo spazio dei nomi WMI del client Configuration Manager. Per altre informazioni, vedere How to Connect to the Configuration Manager Client WMI Namespace by Using System.Management (Come connettersi allo spazio dei nomi WMI del client Configuration Manager tramite System.Management).
Creare un
ManagementObjectSearcher
oggetto .Creare un
ManagementOperationObserver
oggetto .Aggiungere un
ObjectReadyEventHandler
metodo all'oggettoManagementOperationObserver
.Aggiungere un
CompletedEventHandler
metodo all'oggettoManagementOperationObserver
.Chiamare il metodo Get dell'oggetto
ManagementObjectSearcher
e specificare l'oggettoManagmentOperationObserver
come parametro.Assicurarsi che l'applicazione venga ancora eseguita durante l'esecuzione della query.
Esempio
L'esempio di codice C# seguente esegue query in modo asincrono per i componenti installati in un client.
Per informazioni sulla chiamata del codice di esempio, vedere Come chiamare un metodo di classe WMI tramite 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 |
Oggetto valido ManagementScope . Il percorso deve essere root\ccm. |
Compilazione del codice
Namespaces
Sistema.
System.Management.
Assembly
System.Management.
Programmazione efficiente
L'eccezione che può essere generata è System.Management.ManagementException.
Vedere anche
Informazioni sulla programmazione WMI Configuration Manager
Come chiamare un metodo di classe WMI usando System.Management
Come connettersi allo spazio dei nomi WMI del client Configuration Manager tramite System.Management
Come eseguire una query sincrona tramite System.Management
Come leggere un oggetto WMI usando System.Management