我需要对不同的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类,差异会增加。