Sdílet prostřednictvím


Vyvolání asynchronního dotazu

Asynchronní dotaz, zatímco poněkud složitější k zápisu, je upřednostňovaným typem dotazu, kdy bude ovlivněn výkon systému nebo sítě dotazováním velké skupiny dat. Ve skriptu vytvoření SWbemSink objekt a podprogramy pro zpracování událostí, které by jímka mohla přijímat, jsou jedinými dalšími úkoly nad rámec základního dotazu.

Poznámka

Vzhledem k tomu, že zpětné volání do jímky nemusí být vráceno na stejné úrovni ověřování jako klient vyžaduje, doporučujeme místo asynchronní komunikace použít polosynchronní. Další informace naleznete v tématu Volání metody.

 

Následující zkrácené skriptové dotazy na všechny datové soubory na místním počítači. Tento dotaz může trvat příliš dlouhou dobu, pokud byl proveden pro všechny počítače v síti. Objekt SWbemSink je nastavený a jedinou událostí, která je zpracována, je událost 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

Podrobné informace o vytváření asynchronních volání metod ve skriptu naleznete v tématu Volání metody.

V aplikacích C++ vytvoří asynchronní dotaz samostatný proces pro příjem dat dotazu. Asynchronní dotaz je složitější než synchronní dotaz, protože musíte naprogramovat vícevláknovou aplikaci. Asynchronní dotaz však nemá monopolizaci hlavního vlákna vaší aplikace.

Následující postup popisuje, jak provést asynchronní dotaz v jazyce C++.

Provedení asynchronního dotazu v jazyka C++

  1. Implementujte objekt IWbemSink.

    Objekt IWbemSink obdrží informace o asynchronní operaci.

  2. Popište dotaz ve volání IWbemServices::ExecQueryAsync.

    WMI okamžitě přesune proces, který dotazuje CIM do jiného vlákna, a uvolní vlákno, které dotaz spustil pro jinou úlohu.

  3. Počkejte, až rozhraní WMI zavolá metodu IWbemObjectSink::Indicate.

    Po dokončení volá rozhraní WMI indikovat a signalizovat aplikaci, že dotaz byl dokončen. Rozhraní WMI také vrátí výsledky dotazu do místa příjmu jako ukazatel na ukazatel rozhraní IEnumWbemClassObject. Stejně jako u synchronního dotazu použijte ukazatel pro přístup k objektům, které tvoří výsledek dotazu.

Následující příklad kódu se nezkompiluje bez chyby, protože třída QuerySink nebyla definována. Pro definici třídy QuerySink viz IWbemObjectSink. Příklad kódu také vyžaduje následující odkaz a #include příkazy.

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

Následující příklad kódu ukazuje, jak provést asynchronní volání k vydání dotazu.

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");
}

Další informace naleznete v tématu Volání metody.