Вызов асинхронного запроса

Асинхронный запрос, в то время как несколько более сложный для записи, является предпочтительным типом запроса, когда производительность системы или сети будет влиять на запросы большой группы данных. В скрипте создание объекта SWbemSink и подпрограмм для обработки событий, которые приемник может получать, являются единственными дополнительными задачами, выходящими за рамки базового запроса.

Примечание

Так как обратный вызов в приемник может не возвращаться на том же уровне проверки подлинности, что и клиент, рекомендуется использовать полусинхронное вместо асинхронного взаимодействия. Дополнительные сведения см. в разделе "Вызов метода".

 

Следующий сокращенный скрипт запрашивает все файлы данных на локальном компьютере. Этот запрос может занять слишком много времени, если он был выполнен для всех компьютеров в сети. Объект SWbemSink настроен, и единственным обрабатываемым событием является событие 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

Подробные сведения о создании вызовов асинхронных методов в скрипте см. в разделе "Вызов метода".

В приложениях C++ асинхронный запрос создает отдельный процесс для получения данных запроса. Асинхронный запрос является более сложным, чем синхронный запрос, так как необходимо закодировал многопоточное приложение. Однако асинхронный запрос не монополизирует основной поток приложения.

В следующей процедуре описывается выполнение асинхронного запроса в C++.

Выполнение асинхронного запроса в C++

  1. Реализуйте объект IWbemSink .

    Объект IWbemSink получает сведения об асинхронной операции.

  2. Опишите запрос в вызове IWbemServices::ExecQueryAsync.

    WMI немедленно перемещает процесс, который запрашивает CIM в другой поток и освобождает поток, выполняющий запрос для другой задачи.

  3. Подождите, пока WMI вызовет метод IWbemObjectSink::Indicate .

    По завершении вызовы WMI указывают, чтобы сообщить приложению, что запрос завершен. WMI также возвращает результаты запроса в приемник в качестве указателя на указатель интерфейса IEnumWbemClassObject . Как и в случае с синхронным запросом, используйте указатель для доступа к объектам, составляющим результат запроса.

Следующий пример кода не компилируется без ошибки, так как класс QuerySink не определен. Определение класса QuerySink см. в разделе IWbemObjectSink. В примере кода также требуется следующая ссылка и #include инструкции.

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

В следующем примере кода показано, как выполнить асинхронный вызов запроса.

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

Дополнительные сведения см. в разделе "Вызов метода".