我需要对不同的WMI类执行各种查询,然后逐个进行查询,以提高我在此想到的执行速度:
在C#或VB.Net中,我想知道是否可以一次查询以一次检索多个类的属性。
随机非功能性示例:
Using wmi As New Management.ManagementObjectSearcher(
"select SerialNumber from Win32_BaseBoard, select Caption from Win32_Process"
)
...
End Using
如果是,哪个是正确的查询语法?
答案 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类,差异确实会增加。