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

时间:2015-06-03 16:57:55

标签: c# .net vb.net windows wmi

我需要对不同的WMI类执行各种查询,然后逐个进行查询,以提高我在此想到的执行速度:

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

随机非功能性示例:

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

...

End Using

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

1 个答案:

答案 0 :(得分:2)

如何使用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连续运行4到72-80ms,15-20ms将它们作为任务运行(NET 4 ver慢2-3ms)。几乎同样快(18-25ms)是一个Parrallel.ForEach,但似乎不太参与,也适用于.NET 4.0:

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

所有四种方法都会在wList中返回相同的结果,但顺序不同,因此您需要一种方法来确定哪些结果属于哪种结果。如果查询一些真正慢的WMI类,差异确实会增加。