【问题标题】:Perform a single WMI query to multiple classes, it is possibly?对多个类执行单个 WMI 查询,可能吗?
【发布时间】:2015-06-03 16:57:55
【问题描述】:

我需要对不同的WMI类进行各种查询,而不是一个一个地做查询,提高执行速度我在此想到的:

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

随机无效的例子:

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

...

End Using

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

【问题讨论】:

  • 是什么让您认为组合查询不会简单地花费 2ce 时间?
  • @Plutonix,与 Process 类 (GetProcesses) 相比,我对 Win32_Process 执行时间进行了一些时间测量,但你可以在任何地方看到这一点,我一直听说 WMI 与其他方式不同需要很长时间检索相同的信息(在 .Net 类库下),我也做了我的措施

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


【解决方案1】:

这个怎么样,使用 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-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)

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

【讨论】:

  • 根本不是一个查询,但异步方法非常好,谢谢@Plutonix。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多