对多个 类 执行单个 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 类,差异确实会增加。
我需要对不同的 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 类,差异确实会增加。