叫用非同步查詢

非同步查詢雖然稍微複雜一點,但比較複雜,但當系統或網路效能受到查詢大量資料群組的影響時,是慣用的查詢類型。 在腳本中,建立 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");
}

如需詳細資訊,請參閱 呼叫方法