Udostępnij za pośrednictwem


Wywoływanie zapytania asynchronicznego

Zapytanie asynchroniczne, choć nieco bardziej złożone do zapisu, jest preferowanym typem zapytania, gdy wydajność systemu lub sieci będzie miała wpływ na wykonywanie zapytań dotyczących dużej grupy danych. W skrypcie tworzenie obiektu SWbemSink i podprogramów do obsługi zdarzeń, które może odbierać element wyjściowy, to jedyne dodatkowe zadania poza podstawowym zapytaniem.

Notatka

Ponieważ wywołanie zwrotne do ujścia może nie być zwracane na takim samym poziomie uwierzytelniania, jakiego wymaga klient, zaleca się użycie komunikacji semisynchronicznej zamiast asynchronicznej. Aby uzyskać dodatkowe informacje, zobacz Wywoływanie metody.

 

Poniższy skrócony skrypt wykonuje zapytania dotyczące wszystkich plików danych na komputerze lokalnym. To zapytanie może zająć zbyt dużo czasu, jeśli zostało wykonane dla wszystkich maszyn w sieci. Skonfigurowano obiekt SWbemSink, a jedynym obsługiwanym zdarzeniem jest zdarzenie 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

Aby uzyskać szczegółowe informacje na temat konstruowania asynchronicznych wywołań metod w skrypcie, zobacz Wywołanie metody.

W aplikacjach języka C++ zapytanie asynchroniczne tworzy oddzielny proces odbierania danych zapytania. Zapytanie asynchroniczne jest bardziej złożone niż zapytanie synchroniczne, ponieważ należy kodować wielowątkową aplikację. Jednak zapytanie asynchroniczne nie monopolizuje głównego wątku aplikacji.

Poniższa procedura opisuje sposób wykonywania zapytania asynchronicznego w języku C++.

Aby wykonać zapytanie asynchroniczne w języku C++

  1. Zaimplementuj obiekt IWbemSink.

    Obiekt IWbemSink odbiera informacje o operacji asynchronicznej.

  2. Opisz swoje zapytanie w wywołaniu metody IWbemServices::ExecQueryAsync.

    Usługa WMI natychmiast przenosi proces, który wysyła zapytanie do CIM, do innego wątku i zwalnia wątek, który wykonał zapytanie, na rzecz innego zadania.

  3. Poczekaj, aż usługa WMI wywoła IWbemObjectSink::Wskaż metodę.

    Po zakończeniu WMI wykonuje wywołanie , aby wskazać, sygnalizując aplikacji, że zapytanie zostało ukończone. WMI zwraca również wyniki zapytania do odbiornika jako wskaźnik interfejsu IEnumWbemClassObject. Podobnie jak w przypadku zapytania synchronicznego, użyj wskaźnika, aby uzyskać dostęp do obiektów tworzących wynik zapytania.

Poniższy przykład kodu nie kompiluje się bez błędu, ponieważ klasa QuerySink nie została zdefiniowana. Aby uzyskać definicję klasy QuerySink, zobacz IWbemObjectSink. Przykładowy kod wymaga również następującej referencji i dyrektyw #include.

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

Poniższy przykład kodu pokazuje, jak utworzyć asynchroniczne wywołanie w celu wystawienia zapytania.

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

Aby uzyskać więcej informacji, zobacz Wywoływanie metody.