Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een asynchrone query, hoewel iets complexer te schrijven, is het voorkeurstype query wanneer systeem- of netwerkprestaties worden beïnvloed door een grote groep gegevens op te vragen. In het script is het maken van een SWbemSink object en subroutines voor het afhandelen van de gebeurtenissen die de sink kan ontvangen, de enige aanvullende taken buiten de basisquery.
Notitie
Omdat de callback naar de sink mogelijk niet op hetzelfde verificatieniveau wordt geretourneerd als de client vereist, wordt u aangeraden semisynchroon te gebruiken in plaats van asynchrone communicatie. Zie Een methode aanroepenvoor meer informatie.
De volgende verkorte scriptquery's voor alle gegevensbestanden op de lokale computer. Deze query kan veel tijd in beslag nemen als deze voor alle computers in een netwerk is uitgevoerd. Er is een SWbemSink-object ingesteld en de enige gebeurtenis die wordt verwerkt, is de gebeurtenis 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
Zie Een methode aanroepenvoor gedetailleerde informatie over het maken van asynchrone methodeaanroepen in een script.
In C++-toepassingen vormt een asynchrone query een afzonderlijk proces voor het ontvangen van querygegevens. Een asynchrone query is complexer dan een synchrone query, omdat u een multithreaded-toepassing moet codeeren. Een asynchrone query maakt de hoofdthread van uw toepassing echter niet in beslag.
In de volgende procedure wordt beschreven hoe u een asynchrone query uitvoert in C++.
Een asynchrone query uitvoeren in C++
Een IWbemSink--object implementeren.
Een IWbemSink object ontvangt informatie over een asynchrone bewerking.
Beschrijf uw query in een aanroep naar IWbemServices::ExecQueryAsync.
WMI verplaatst onmiddellijk het proces waarmee de CIM wordt opgevraagd naar een andere thread en maakt de thread vrij die de query voor een andere taak heeft uitgevoerd.
Wacht tot WMI de methode IWbemObjectSink::Indicate oproept.
Wanneer u klaar bent, roept WMI aan om aan te geven dat de query is voltooid. WMI retourneert ook resultaten van de query naar de sink als een aanwijzer naar een IEnumWbemClassObject interfaceaanwijzer. Net als bij een synchrone query gebruikt u de aanwijzer om toegang te krijgen tot de objecten waaruit het resultaat van uw query bestaat.
Het volgende codevoorbeeld compileert niet zonder een fout omdat de klasse QuerySink niet is gedefinieerd. Zie IWbemObjectSinkvoor de definitie van de klasse QuerySink. Voor het codevoorbeeld zijn ook de volgende referentie- en #include-verklaringen vereist.
#include <iostream>
using namespace std;
#include <wbemidl.h>
In het volgende codevoorbeeld ziet u hoe u een asynchrone aanroep kunt maken om een query uit te voeren.
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");
}
Zie Een methode aanroepenvoor meer informatie.