查询每个进程的WMIis将会很痛苦slow。你应该做的是返回all类,然后通过进程 ID 进行“托管比较”。在下面的例子中我读到all每个类的属性并将每个类映射到其对应的Process
。执行时间处理时间:165.53 ms
。注意,这包括Process.GetProcesses()
。不,我没有超级计算机。
(注意:您需要添加对系统管理.dll)
Imports System.Management
Public Class Win32Process
Public Property Caption() As String
Public Property CommandLine() As String
Public Property CreationClassName() As String
Public Property CreationDate() As DateTime?
Public Property CSCreationClassName() As String
Public Property CSName() As String
Public Property Description() As String
Public Property ExecutablePath() As String
Public Property ExecutionState() As UInt16?
Public Property Handle() As String
Public Property HandleCount() As UInt32?
Public Property InstallDate() As DateTime?
Public Property KernelModeTime() As UInt64?
Public Property MaximumWorkingSetSize() As UInt32?
Public Property MinimumWorkingSetSize() As UInt32?
Public Property Name() As String
Public Property OSCreationClassName() As String
Public Property OSName() As String
Public Property OtherOperationCount() As UInt64?
Public Property OtherTransferCount() As UInt64?
Public Property PageFaults() As UInt32?
Public Property PageFileUsage() As UInt32?
Public Property ParentProcessId() As UInt32?
Public Property PeakPageFileUsage() As UInt32?
Public Property PeakVirtualSize() As UInt64?
Public Property PeakWorkingSetSize() As UInt32?
Public Property Priority() As UInt32?
Public Property PrivatePageCount() As UInt64?
Public Property ProcessId() As UInt32?
Public Property QuotaNonPagedPoolUsage() As UInt32?
Public Property QuotaPagedPoolUsage() As UInt32?
Public Property QuotaPeakNonPagedPoolUsage() As UInt32?
Public Property QuotaPeakPagedPoolUsage() As UInt32?
Public Property ReadOperationCount() As UInt64?
Public Property ReadTransferCount() As UInt64?
Public Property SessionId() As UInt32?
Public Property Status() As String
Public Property TerminationDate() As DateTime?
Public Property ThreadCount() As UInt32?
Public Property UserModeTime() As UInt64?
Public Property VirtualSize() As UInt64?
Public Property WindowsVersion() As String
Public Property WorkingSetSize() As UInt64?
Public Property WriteOperationCount() As UInt64?
Public Property WriteTransferCount() As UInt64?
Public Shared Function GetProcesses() As Win32Process()
Using searcher As New ManagementObjectSearcher("select * from Win32_Process")
Return (
From
item As ManagementObject
In
searcher.[Get]().Cast(Of ManagementObject)()
Select New Win32Process() With {
.Caption = CType(item.Properties("Caption").Value, String),
.CommandLine = CType(item.Properties("CommandLine").Value, String),
.CreationClassName = CType(item.Properties("CreationClassName").Value, String),
.CreationDate = ManagementUtils.ToDateTime(item.Properties("CreationDate").Value),
.CSCreationClassName = CType(item.Properties("CSCreationClassName").Value, String),
.CSName = CType(item.Properties("CSName").Value, String),
.Description = CType(item.Properties("Description").Value, String),
.ExecutablePath = CType(item.Properties("ExecutablePath").Value, String),
.ExecutionState = CType(item.Properties("ExecutionState").Value, UInt16?),
.Handle = CType(item.Properties("Handle").Value, String),
.HandleCount = CType(item.Properties("HandleCount").Value, UInt32?),
.InstallDate = ManagementUtils.ToDateTime(item.Properties("InstallDate").Value),
.KernelModeTime = CType(item.Properties("KernelModeTime").Value, UInt64?),
.MaximumWorkingSetSize = CType(item.Properties("MaximumWorkingSetSize").Value, UInt32?),
.MinimumWorkingSetSize = CType(item.Properties("MinimumWorkingSetSize").Value, UInt32?),
.Name = CType(item.Properties("Name").Value, String),
.OSCreationClassName = CType(item.Properties("OSCreationClassName").Value, String),
.OSName = CType(item.Properties("OSName").Value, String),
.OtherOperationCount = CType(item.Properties("OtherOperationCount").Value, UInt64?),
.OtherTransferCount = CType(item.Properties("OtherTransferCount").Value, UInt64?),
.PageFaults = CType(item.Properties("PageFaults").Value, UInt32?),
.PageFileUsage = CType(item.Properties("PageFileUsage").Value, UInt32?),
.ParentProcessId = CType(item.Properties("ParentProcessId").Value, UInt32?),
.PeakPageFileUsage = CType(item.Properties("PeakPageFileUsage").Value, UInt32?),
.PeakVirtualSize = CType(item.Properties("PeakVirtualSize").Value, UInt64?),
.PeakWorkingSetSize = CType(item.Properties("PeakWorkingSetSize").Value, UInt32?),
.Priority = CType(item.Properties("Priority").Value, UInt32?),
.PrivatePageCount = CType(item.Properties("PrivatePageCount").Value, UInt64?),
.ProcessId = CType(item.Properties("ProcessId").Value, UInt32?),
.QuotaNonPagedPoolUsage = CType(item.Properties("QuotaNonPagedPoolUsage").Value, UInt32?),
.QuotaPagedPoolUsage = CType(item.Properties("QuotaPagedPoolUsage").Value, UInt32?),
.QuotaPeakNonPagedPoolUsage = CType(item.Properties("QuotaPeakNonPagedPoolUsage").Value, UInt32?),
.QuotaPeakPagedPoolUsage = CType(item.Properties("QuotaPeakPagedPoolUsage").Value, UInt32?),
.ReadOperationCount = CType(item.Properties("ReadOperationCount").Value, UInt64?),
.ReadTransferCount = CType(item.Properties("ReadTransferCount").Value, UInt64?),
.SessionId = CType(item.Properties("SessionId").Value, UInt32?),
.Status = CType(item.Properties("Status").Value, String),
.TerminationDate = ManagementUtils.ToDateTime(item.Properties("TerminationDate").Value),
.ThreadCount = CType(item.Properties("ThreadCount").Value, UInt32?),
.UserModeTime = CType(item.Properties("UserModeTime").Value, UInt64?),
.VirtualSize = CType(item.Properties("VirtualSize").Value, UInt64?),
.WindowsVersion = CType(item.Properties("WindowsVersion").Value, String),
.WorkingSetSize = CType(item.Properties("WorkingSetSize").Value, UInt64?),
.WriteOperationCount = CType(item.Properties("WriteOperationCount").Value, UInt64?),
.WriteTransferCount = CType(item.Properties("WriteTransferCount").Value, UInt64?)
}
).ToArray()
End Using
End Function
End Class
Friend Class ManagementUtils
Friend Shared Function ToDateTime(value As Object) As DateTime?
If (value Is Nothing) Then
Return CType(Nothing, DateTime?)
End If
Return ManagementDateTimeConverter.ToDateTime(CType(value, String))
End Function
End Class
Test
Dim watch As New Stopwatch()
watch.[Start]()
Dim result As New Dictionary(Of Process, Win32Process)
Dim processes As Win32Process() = Win32Process.GetProcesses()
Process.GetProcesses().AsParallel().ForAll(
Sub(p As Process)
SyncLock result
result.Add(p, (From item In processes.AsEnumerable() Where (item.ProcessId.HasValue AndAlso (CUInt(p.Id) = item.ProcessId.Value)) Select item).FirstOrDefault())
End SyncLock
End Sub)
watch.[Stop]()
Debug.WriteLine("Time: {0} ms, Win32ProcessCount={1}, ProcessCount={1}", watch.Elapsed.TotalMilliseconds, processes.Length, result.Count)
Debug.WriteLine("**************")
Debug.WriteLine(String.Join(Environment.NewLine, (From pair As KeyValuePair(Of Process, Win32Process) In result Select String.Format("Id={0}, Matched={1}", pair.Key.Id.ToString("X8"), (Not pair.Value Is Nothing)))))
Result
时间:165.53 毫秒,Win32ProcessCount=96,ProcessCount=96
**************
Id=00001B1C,匹配=True
Id=000019FC,匹配=True
Id=000006EC,匹配=True
Id=000007B0,匹配=True
Id=00001CC0,匹配=True
ID=00001024,匹配=True
Id=00000AC0,匹配=True
Id=0000078C,匹配=True
Id=00001BA8,匹配=True
Id=00000B7C,匹配=True
ID=00000304,匹配=True
Id=0000079C,匹配=True
Id=00000238,匹配=True
Id=00000F80,匹配=True
Id=000003C0,匹配=True
Id=00000170,匹配=True
ID=00000234,匹配=True
ID=00001634,匹配=True
ID=00000230,匹配=True
Id=00001B94,匹配=True
ID=00000540,匹配=True
ID=00001254,匹配=True
Id=00001A04,匹配=True
Id=000002EC,匹配=True
ID=00000474,匹配=True
ID=00000910,匹配=True
Id=000005B8,匹配=True
Id=000004F0,匹配=True
Id=00000114,匹配=True
Id=000015D8,匹配=True
Id=00000738,匹配=True
Id=0000144C,匹配=True
Id=0000133C,匹配=True
ID=00001384,匹配=True
Id=000007F8,匹配=True
Id=00000294,匹配=True
Id=000012BC,匹配=True
Id=00000D58,匹配=True
Id=00000B08,匹配=True
Id=00001F08,匹配=True
Id=00000AFC,匹配=True
Id=00000B04,匹配=True
ID=00001750,匹配=True
Id=000008B0,匹配=True
Id=0000199C,匹配=True
Id=000001C0,匹配=True
ID=00000970,匹配=True
ID=00000720,匹配=True
Id=0000136C,匹配=True
Id=000001B8,匹配=True
Id=000001B4,匹配=True
Id=000012A0,匹配=True
Id=00000D3C,匹配=True
Id=0000093C,匹配=True
ID=00001890,匹配=True
Id=000012D0,匹配=True
Id=000003F8,匹配=True
ID=00000330,匹配=True
Id=00000AE0,匹配=True
ID=00000954,匹配=True
Id=000002B4,匹配=True
Id=00000C64,匹配=True
Id=00000574,匹配=True
Id=00001FD4,匹配=True
Id=000018BC,匹配=True
Id=00001A44,匹配=True
Id=00000B94,匹配=True
ID=00000630,匹配=True
Id=000003E0,匹配=True
Id=00000004,匹配=True
Id=0000102C,匹配=True
Id=000005C0,匹配=True
Id=00000000,匹配=True
Id=000009D0,匹配=True
Id=00000C1C,匹配=True
Id=00000218,匹配=True
Id=00000A88,匹配=True
Id=00000B70,匹配=True
Id=000002D4,匹配=True
Id=00000398,匹配=True
Id=0000020C,匹配=True
Id=000009B8,匹配=True
Id=0000082C,匹配=True
Id=00001298,匹配=True
Id=000009B0,匹配=True
ID=00000760,匹配=True
Id=00000F40,匹配=True
Id=00000758,匹配=True
Id=00001128,匹配=True
Id=000005C8,匹配=True
Id=00000C24,匹配=True
ID=00001900,匹配=True
Id=0000124C,匹配=True
Id=00001148,匹配=True
Id=0000120C,匹配=True
Id=00000CA8,匹配=True