调用异步查询

异步查询虽然在写入方面更复杂一些,但当系统或网络性能受查询大量数据的影响时,异步查询是首选的查询类型。 在脚本中,创建 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");
}

有关详细信息,请参阅调用方法