如何使用 System.Management 執行非同步查詢
若要在Configuration Manager用戶端 Windows Instrumentation (WMI) 命名空間上執行非同步查詢,請建立 ManagementObjectSearcher
指定 WQL 查詢的 物件。 接著,您會建立 , ManagementOperationObserver
為每個查詢結果以及查詢結尾指定事件處理常式。
使用 物件呼叫 ManagementOperationObserver
物件 Get 方法時, ManagementObjectSearcher
會執行非同步查詢。
執行非同步查詢
設定與Configuration Manager用戶端 WMI 命名空間的連線。 如需詳細資訊,請參閱How to Connect to the Configuration Manager Client WMI Namespace by Using System.Management。
ManagementObjectSearcher
建立 物件。ManagementOperationObserver
建立 物件。ObjectReadyEventHandler
將 方法新增至ManagementOperationObserver
物件。CompletedEventHandler
將 方法新增至ManagementOperationObserver
。ManagementObjectSearcher
呼叫物件 Get 方法,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 物件