叫用異步查詢
異步查詢雖然比較複雜,但當系統或網路效能受到查詢大量數據群組的影響時,仍是首選的查詢類型。 在腳本中,建立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++ 中執行異步查詢
實作 IWbemSink 物件。
IWbemSink 物件接收關於異步作業的相關資訊。
在呼叫 IWbemServices::ExecQueryAsync中描述您的查詢。
WMI 會立即將查詢 CIM 的進程移至另一個線程,並釋放執行另一個工作查詢的線程。
等待 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");
}
如需詳細資訊,請參閱 呼叫 方法。