对多个类执行单个WMI查询,可能是?

我需要对不同的WMI类执行各种查询,而不是逐个查询,以提高执行速度,我认为这是:

在C#或VB.Net,我想知道是否可以做一个单一的查询一次检索多个类的属性。

随机没有function的例子:

Using wmi As New Management.ManagementObjectSearcher( "select SerialNumber from Win32_BaseBoard, select Caption from Win32_Process" ) ... End Using 

如果是,哪个是正确的查询语法?

怎么样,使用NET 4.5:

 Imports System.Management Imports System.Collections.Concurrent Imports System.Threading.Tasks Dim wql As String() = {"SELECT SerialNumber FROM Win32_BaseBoard", "SELECT Name FROM Win32_BIOS", "SELECT VideoProcessor FROM Win32_VideoController", "SELECT RegisteredUser FROM Win32_OperatingSystem"} Dim tasks As New List(Of Task) For Each q In wql Dim t As task = Task.Run(Sub() Dim str = WMI.GetWMIClassProperty(q) wList.Add(str) End Sub ) tasks.Add(t) Next Task.WaitAll(tasks.ToArray) 

这是NET 4.0版本:

 Dim wmiAction As Action(Of Object) = Sub(s As Object) Dim str = WMI.GetWMIClassProperty(s.ToString) wList.Add(str) End Sub Dim tasks As New List(Of Task) For Each q In wql Dim t As New task(wmiAction, q) tasks.Add(t) t.Start() Next Task.WaitAll(tasks.ToArray) 

WMI.GetWMIClassProperty只是为查询创建一个搜索器,并返回第一个属性或String.Empty

使用Stopwatch需要72-80毫秒连续运行4,15-20毫秒运行它们作为任务(NET 4 ver是2-3毫秒慢)。 几乎一样快(18-25毫秒)是一个Parrallel.ForEach但似乎是一个较少的参与,也适用于NET 4.0:

 Parallel.ForEach(wql, Sub(thisQ) Dim str = WMI.GetWMIClassProperty(thisQ) wList.Add(str) End Sub) 

所有四个方法在wList返回相同的结果,尽管顺序不同,所以你需要一种方法来限定哪些结果是哪个结果。 如果查询一些真正慢的WMI类,差异会增加。