Поделиться через


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

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

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