다음을 통해 공유


비동기 쿼리 호출

비동기 쿼리는 쓰기가 다소 복잡하지만 시스템 또는 네트워크 성능이 대규모 데이터 그룹을 쿼리하여 영향을 받을 때 선호되는 쿼리 유형입니다. 스크립트에서 싱크가 수신할 수 있는 이벤트를 처리하는 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는 Indicate를 호출하여 쿼리가 완료되었음을 애플리케이션에 알릴 수 있습니다. 또한 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");
}

자세한 내용은 메서드 호출을 참조하세요.