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