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

Perform a single WMI query to multiple classes, it is possibly?

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

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

随机非功能示例:

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 只是为查询创建一个搜索器,return 是第一个 属性 或 String.Empty

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

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

所有四种方法 return 在 wList 中的结果相同,但顺序不同,因此您需要一种方法来限定哪些结果是哪些。如果您查询一些非常慢的 WMI 类,差异确实会增加。