如何使用 System.Management 执行异步查询
若要对 Configuration Manager 客户端 Windows Instrumentation (WMI) 命名空间执行异步查询,请创建一个ManagementObjectSearcher
指定 WQL 查询的对象。 然后,创建一个 , ManagementOperationObserver
它为每个查询结果指定事件处理程序,并为查询末尾指定事件处理程序。
使用 对象调用ManagementOperationObserver
对象 Get 方法时ManagementObjectSearcher
,将运行异步查询。
执行异步查询
设置与Configuration Manager客户端 WMI 命名空间的连接。 有关详细信息,请参阅如何使用 System.Management 连接到 Configuration Manager 客户端 WMI 命名空间。
创建
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;
}
此示例方法具有以下参数:
参数 | 类型 | 说明 |
---|---|---|
Scope |
ManagementScope |
有效的 ManagementScope 。 路径应为 root\ccm。 |
编译代码
命名空间
系统。
System.Management。
Assembly
System.Management。
可靠编程
可以引发的异常是 System.Management.ManagementException。
另请参阅
关于Configuration Manager WMI 编程
如何使用 System.Management 调用 WMI 类方法
如何使用 System.Management 连接到 Configuration Manager 客户端 WMI 命名空间
如何使用 System.Management 执行同步查询
如何使用 System.Management 读取 WMI 对象