若要在 Configuration Manager 用戶端上執行非同步查詢 Windows Instrumentation (WMI) 命名空間,請建立指定 ManagementObjectSearcher WQL 查詢的物件。 接著,您可以建立一個 ManagementOperationObserver 指定每個查詢結果的事件處理常式,以及查詢結尾的事件處理常式。
非同步查詢會在物件 Get 方法與物件一起ManagementOperationObserver呼叫時ManagementObjectSearcher執行。
若要執行非同步查詢
設定 Configuration Manager 用戶端 WMI 命名空間的連線。 如需詳細資訊,請參閱如何使用 System.Management 連線到 Configuration Manager 用戶端 WMI 命名空間。
建立物件
ManagementObjectSearcher。建立物件
ManagementOperationObserver。新增
ObjectReadyEventHandler方法物件ManagementOperationObserver。CompletedEventHandler在 .ManagementOperationObserver呼叫物件
ManagementObjectSearcherGet 方法,並將物件提供為ManagmentOperationObserver參數。請確定您的應用程式在查詢執行時仍可執行。
範例
下列 C# 程式碼範例會非同步查詢用戶端上安裝的元件。
如需呼叫範例程式碼的詳細資訊,請參閱 如何使用 System.Management 呼叫 WMI 類別方法。
public void EnumerateInstancesAsync(ManagementScope scope)
{
try
{
// Instantiate an object searcher with the query.
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, new
SelectQuery("CCM_InstalledComponent"));
// Create a results watcher object
// and handler for results and completion.
ManagementOperationObserver results = new
ManagementOperationObserver();
// Attach handler to events for results and completion.
results.ObjectReady += new
ObjectReadyEventHandler(this.NewObject);
results.Completed += new
CompletedEventHandler(this.Done);
Console.WriteLine("Installed Components");
Console.WriteLine("--------------------");
Console.WriteLine();
// Call the asynchronous overload of Get()
// to start the enumeration.
searcher.Get(results);
// Do something else while results
// arrive asynchronously.
while (!this.Completed)
{
System.Threading.Thread.Sleep(1000);
}
this.Reset();
}
catch (ManagementException e)
{
Console.WriteLine("Failed to run query: " + e.Message);
throw;
}
}
private bool isCompleted = false;
private void NewObject(object sender,
ObjectReadyEventArgs obj)
{
try
{
Console.WriteLine("Name: {0}, Version = {1}",
obj.NewObject["DisplayName"],
obj.NewObject["Version"]);
}
catch (ManagementException e)
{
Console.WriteLine("Error: " + e.Message);
}
}
private bool Completed
{
get
{
return isCompleted;
}
}
private void Reset()
{
isCompleted = false;
}
private void Done(object sender,
CompletedEventArgs obj)
{
isCompleted = true;
}
此範例方法具有下列參數:
| 參數 | Type | 描述 |
|---|---|---|
Scope |
ManagementScope |
有效的 ManagementScope. 路徑應為 root\ccm。 |
正在編譯程式碼
命名空間
系統。
System.Management。
組件
System.Management。
健全的程式設計
可能會引發的例外狀況為 System.Management.ManagementException。
另請參閱
關於 Configuration Manager WMI 程式設計
如何使用 System.Management 來呼叫 WMI 類別方法
如何使用 System.Management 連線到 Configuration Manager 用戶端 WMI 命名空間
如何使用 System.Management 執行同步查詢
如何使用 System.Management 讀取 WMI 物件