Invocar uma consulta assíncrona

Uma consulta assíncrona, embora um pouco mais complexa de gravar, é o tipo preferencial de consulta quando o desempenho do sistema ou da rede será afetado pela consulta de um grande grupo de dados. No script, criar um objeto SWbemSink e sub-rotinas para lidar com os eventos que o coletor poderia receber são as únicas tarefas adicionais além da consulta básica.

Observação

Como o retorno de chamada para o coletor pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável que você use comunicação semissíncrona em vez de assíncrona. Para obter mais informações, consulte Chamar um método.

 

As consultas de script abreviadas a seguir para todos os arquivos de dados no computador local. Essa consulta pode levar um tempo excessivo se ela for executada para todos os computadores em uma rede. Um objeto SWbemSink é configurado e o único evento que é manipulado é o 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 obter informações detalhadas sobre como construir chamadas de método assíncronas no script, consulte Chamar um método.

Em aplicativos C++, uma consulta assíncrona gera um processo separado para receber dados de consulta. Uma consulta assíncrona é mais complexa do que uma consulta síncrona, pois você deve codificar um aplicativo com vários segmentos. No entanto, uma consulta assíncrona não monopoliza o thread principal do aplicativo.

O procedimento a seguir descreve como executar uma consulta assíncrona no C++.

Para executar uma consulta assíncrona no C++

  1. Implemente um objeto IWbemSink.

    Um objeto IWbemSink recebe informações sobre uma operação assíncrona.

  2. Descreva sua consulta em uma chamada para IWbemServices::ExecQueryAsync.

    O WMI move imediatamente o processo que consulta o CIM para outro thread e libera o thread que executou a consulta para outra tarefa.

  3. Aguarde até que o WMI chame o método IWbemObjectSink::Indicate.

    Quando terminar, o WMI chamará o Indicar para sinalizar ao aplicativo que a consulta está concluída. O WMI também retorna os resultados da consulta para o coletor como um ponteiro para um ponteiro de interface IEnumWbemClassObject. Assim como acontece com uma consulta síncrona, use o ponteiro para acessar os objetos que compõem o resultado da consulta.

O exemplo de código a seguir não é compilado sem um erro porque a classe QuerySink não foi definida. Para obter a definição da classe QuerySink, consulte IWbemObjectSink. O exemplo de código também requer as seguintes referências e instruções #include.

#include <iostream>
using namespace std;
#include <wbemidl.h>

O exemplo de código a seguir mostra como fazer uma chamada assíncrona para emitir uma 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 obter mais informações, consulte Chamar um método.