Richiamo di una query asincrona

Una query asincrona, mentre è leggermente più complessa da scrivere, è il tipo preferito di query quando le prestazioni di sistema o di rete saranno interessate dall'esecuzione di query su un gruppo di dati di grandi dimensioni. Nello script creare un oggetto SWbemSink e sottoroutine per gestire gli eventi che il sink potrebbe ricevere sono le uniche attività aggiuntive oltre alla query di base.

Nota

Poiché il callback nel sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare semisynchrono anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamata di un metodo.

 

Le query di script abbreviate seguenti per tutti i file di dati nel computer locale. Questa query potrebbe richiedere un tempo eccessivo se è stata eseguita per tutti i computer in una rete. Un oggetto SWbemSink è configurato 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 di metodo asincrone nello script, vedere Chiamata di un metodo.

Nelle applicazioni C++ una query asincrona genera un processo separato per ricevere dati di query. Una query asincrona è più complessa di una query sincrona, perché è necessario codificare un'applicazione multithreaded. 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++

  1. Implementare un oggetto IWbemSink .

    Un oggetto IWbemSink riceve informazioni su un'operazione asincrona.

  2. Descrivere la query in una chiamata a IWbemServices::ExecQueryAsync.

    WMI sposta immediatamente il processo che esegue una query sul CIM in un altro thread e libera il thread che ha eseguito la query per un'altra attività.

  3. Attendere che WMI chiami il metodo IWbemObjectSink::Indicate .

    Al termine, WMI chiama Indica per segnalare all'applicazione che la query è stata completata. WMI restituisce anche i risultati della query nel sink come puntatore a un puntatore a un puntatore dell'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 le istruzioni di riferimento e #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 altre informazioni, vedere Chiamata di un metodo.