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

Асинхронный запрос, хотя и более сложный в написании, является предпочтительным типом запроса, когда производительность системы или сети будет влиять на запросы к большой группе данных. В скрипте создание объекта 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++ асинхронный запрос порождает отдельный процесс для получения данных запроса. Асинхронный запрос является более сложным, чем синхронный, так как необходимо код для многопоточного приложения. Однако асинхронный запрос не монополизирует поток main приложения.

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

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

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

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

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

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

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

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

Следующий пример кода не компилируется без ошибки, так как класс QuerySink не определен. Определение класса QuerySink см. в разделе IWbemObjectSink. В примере кода также требуются следующие операторы reference и #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");
}

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