Invocación de una consulta asincrónica
Una consulta asincrónica, aunque algo más compleja de escribir, es el tipo preferido de consulta cuando el rendimiento del sistema o de la red se verá afectado mediante la consulta de un gran grupo de datos. En el script, la creación de un objeto SWbemSink y subutinas para controlar los eventos que el receptor podría recibir son las únicas tareas adicionales más allá de la consulta básica.
Nota
Dado que es posible que la devolución de llamada al receptor no se devuelva en el mismo nivel de autenticación que requiere el cliente, se recomienda usar la comunicación semisincrónica, en lugar de la asincrónica. Para más información, vea Llamada a un método.
El siguiente script abreviado consulta todos los archivos de datos en el equipo local. Esta consulta podría tardar una cantidad excesiva de tiempo si se ejecutara para todas las máquinas de una red. Se configura un objeto SWbemSink y el único evento que se controla es el 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
Para obtener información detallada sobre cómo construir llamadas de método asincrónicas en el script, vea Llamar a un método.
En las aplicaciones de C++, una consulta asincrónica genera un proceso independiente para recibir datos de consulta. Una consulta asincrónica es más compleja que una consulta sincrónica, ya que debe codificar una aplicación multiproceso. Sin embargo, una consulta asincrónica no monopoliza el subproceso principal de la aplicación.
En el procedimiento siguiente se describe cómo realizar una consulta asincrónica en C++.
Para realizar una consulta asincrónica en C++
Implemente un objeto IWbemSink.
Un objeto IWbemSink recibe información sobre una operación asincrónica.
Describa la consulta en una llamada a IWbemServices::ExecQueryAsync.
WMI mueve inmediatamente el proceso que consulta el CIM a otro subproceso y libera el subproceso que ejecutó la consulta para otra tarea.
Espere a que WMI llame al método IWbemObjectSink::Indicate.
Cuando termine, WMI llama a Indicate para indicar a la aplicación que la consulta está completa. WMI también devuelve los resultados de la consulta al receptor como puntero a un puntero de interfaz IEnumWbemClassObject. Al igual que con una consulta sincrónica, use el puntero para acceder a los objetos que componen el resultado de la consulta.
El ejemplo de código siguiente no se compila sin un error porque no se ha definido la clase QuerySink. Para obtener la definición de la clase QuerySink, vea IWbemObjectSink. El ejemplo de código también requiere las siguientes instrucciones reference e #include.
#include <iostream>
using namespace std;
#include <wbemidl.h>
En el ejemplo de código siguiente se muestra cómo realizar una llamada asincrónica para emitir una consulta.
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");
}
Para más información, vea Llamada a un método.