Appel d’une requête asynchrone
Une requête asynchrone, bien qu’un peu plus complexe à écrire, est le type de requête par défaut, lorsque les performances du système ou du réseau seront affectées par l’interrogation d’un grand groupe de données. Dans le script, créer un objet SWbemSink et des sous-routines pour gérer les événements que le récepteur peut recevoir sont les seules tâches supplémentaires au-delà de la requête de base.
Notes
Étant donné que le rappel au récepteur peut ne pas être retourné au même niveau d’authentification que celui requis par le client, il est recommandé d’utiliser le mode semi-synchrone au lieu de la communication asynchrone. Pour plus d’informations, consultez appel d’une méthode.
Les requêtes de script abrégées suivantes pour tous les fichiers de données sur l’ordinateur local. Cette requête peut prendre beaucoup de temps si elle a été exécutée pour tous les ordinateurs d’un réseau. Un objet SWbemSink est configuré et le seul événement géré est l’événement OnCompleted.
Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
WScript.Echo "Asynchronous operation is done."
End Sub
Set service = GetObject("winmgmts:")
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
service.ExecQueryAsync sink, "SELECT * FROM Win32_DataFile"
WScript.Echo "Waiting for instances."
sink.Cancel()
set sink= Nothing
Pour plus d’informations sur la construction d’appels de méthode asynchrones dans un script, consultez appel d’une méthode.
Dans les applications C++, une requête asynchrone génère un processus distinct pour recevoir les données de la requête. Une requête asynchrone est plus complexe qu’une requête synchrone, car vous devez coder une application multithread. Toutefois, une requête asynchrone ne monopolise pas le thread principal de votre application.
La procédure suivante décrit comment exécuter une requête asynchrone en C++.
Pour exécuter une requête asynchrone en C++
Implémentez un objet IWbemSink .
Un objet IWbemSink reçoit des informations sur une opération asynchrone.
Décrivez votre requête dans un appel à IWbemServices :: ExecQueryAsync.
WMI déplace immédiatement le processus qui interroge le CIM sur un autre thread et libère le thread qui a exécuté la requête pour une autre tâche.
Attendez que WMI appelle la méthode IWbemObjectSink :: indique .
Lorsque vous avez terminé, les appels WMI indiquent à votre application que la requête est terminée. WMI retourne également les résultats de la requête au récepteur en tant que pointeur vers un pointeur d’interface IEnumWbemClassObject . Comme pour une requête synchrone, utilisez le pointeur pour accéder aux objets qui composent le résultat de votre requête.
L’exemple de code suivant ne se compile pas sans erreur, car la classe QuerySink n’a pas été définie. Pour obtenir la définition de la classe QuerySink, consultez IWbemObjectSink. L’exemple de code requiert également les instructions de référence et # include suivantes.
#include <iostream>
using namespace std;
#include <wbemidl.h>
L’exemple de code suivant montre comment effectuer un appel asynchrone pour émettre une requête.
void ExecQuery(IWbemServices *pSvc)
{
// Create a new sink object.
QuerySink *pSink = new QuerySink;
// Initialize the query and query language.
BSTR strQuery = SysAllocString(L"SELECT * FROM ClassName");
BSTR strQueryLang = SysAllocString(L"WQL");
// Issue the query.
HRESULT hRes = pSvc->ExecQueryAsync(strQueryLang, strQuery, 0,
NULL, pSink);
// Clean up.
SysFreeString(strQuery);
SysFreeString(strQueryLang);
if (hRes)
{
printf("ExecQueryAsync failed with = 0x%X\n", hRes);
return;
}
printf("Completed.\n");
}
Pour plus d’informations, consultez appel d’une méthode.