Invocazione di una query asincrona
Una query asincrona, sebbene piuttosto complessa da scrivere, è il tipo di query preferito quando le prestazioni di sistema o di rete saranno influenzate dall'esecuzione di query su un gruppo di dati di grandi dimensioni. Nello script, la creazione di un SWbemSink oggetto e subroutine per gestire gli eventi che il sink potrebbe ricevere sono le uniche attività aggiuntive oltre alla query di base.
Nota
Dato che il callback al sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, si raccomanda di utilizzare la comunicazione semi-sincrona anziché quella asincrona. Per ulteriori informazioni, vedere Chiamare un Metodo.
Le seguenti script abbreviati interrogano tutti i file di dati nel computer locale. Questa query potrebbe richiedere una quantità eccessiva di tempo se fosse stata eseguita per tutti i computer in una rete. Viene configurato un oggetto SWbemSink e l'unico evento gestito è l'evento 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
Per informazioni dettagliate sulla creazione di chiamate asincrone di metodi nello script, vedere Chiamata di un metodo.
Nelle applicazioni C++, una query asincrona genera un processo separato per ricevere i dati della query. Una query asincrona è più complessa di una query sincrona, perché è necessario codificare un'applicazione multithreading. Tuttavia, una query asincrona non monopolizza il thread principale dell'applicazione.
La procedura seguente descrive come eseguire una query asincrona in C++.
Per eseguire una query asincrona in C++
Implementare un oggetto IWbemSink.
Un oggetto IWbemSink riceve informazioni su un'operazione asincrona.
Descrivi la query in una chiamata a IWbemServices::ExecQueryAsync.
WMI sposta immediatamente il processo che esegue query su CIM in un altro thread e libera il thread che ha eseguito la query per un'altra attività.
Attendere che WMI chiami il metodo IWbemObjectSink::Indicate.
Al termine, WMI chiama Indicare per segnalare all'applicazione che la query è stata completata. WMI restituisce anche i risultati della query al sink come puntatore a un'interfaccia IEnumWbemClassObject. Come per una query sincrona, usare il puntatore per accedere agli oggetti che costituiscono il risultato della query.
L'esempio di codice seguente non viene compilato senza un errore perché la classe QuerySink non è stata definita. Per la definizione della classe QuerySink, vedere IWbemObjectSink. L'esempio di codice richiede anche il riferimento e le istruzioni #include seguenti.
#include <iostream>
using namespace std;
#include <wbemidl.h>
Nell'esempio di codice seguente viene illustrato come eseguire una chiamata asincrona per eseguire una query.
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");
}
Per ulteriori informazioni, vedere Chiamare un metodo.