.net 要获取CPU和内存的使用率,一般是通过 PerformanceCounter 或者 WMI 查询得到,但是如果操作系统经常不正常断电或者别的什么原因,让系统的性能计数器抽风了,可能就会造成初始化 PerformanceCounter 对象出错。

性能计数器错误一般可以通过 lodctr /r 可以修复,但是时不时要这么搞一下,对用户总是太不友好了,所以能通过 Win32API 来获取也是一个不错的选项。

代码已封装到两个工具类 CpuUsageNt 和 MemUsage 里面了

''' <summary>
''' Inherits the CPUUsage class and implements the Query method for Windows NT systems.
''' </summary>
''' <remarks>
''' <p>This class works on Windows NT4, Windows 2000, Windows XP, Windows .NET Server and higher.</p>
''' </remarks>
Private NotInheritable Class CpuUsageNt
''' <summary>
''' Initializes a new CpuUsageNt instance.
''' </summary>
''' <exception cref="NotSupportedException">One of the system calls fails.</exception>
Public Sub New()
Dim timeInfo(31) As Byte ' SYSTEM_TIME_INFORMATION structure
Dim perfInfo(311) As Byte ' SYSTEM_PERFORMANCE_INFORMATION structure
Dim baseInfo(43) As Byte ' SYSTEM_BASIC_INFORMATION structure
Dim ret As Integer If (Environment.OSVersion.Platform <> PlatformID.Win32NT) Then
Throw New NotSupportedException()
End If ' get new system time
ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, timeInfo, timeInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get new CPU's idle time
ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, perfInfo, perfInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get number of processors in the system
ret = NtQuerySystemInformation(SYSTEM_BASICINFORMATION, baseInfo, baseInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' store new CPU's idle and system time and number of processors
_oldIdleTime = BitConverter.ToInt64(perfInfo, 0) ' SYSTEM_PERFORMANCE_INFORMATION.liIdleTime
_oldSystemTime = BitConverter.ToInt64(timeInfo, 8) ' SYSTEM_TIME_INFORMATION.liKeSystemTime
_processorCount = baseInfo(40)
End Sub ''' <summary>
''' Determines the current average CPU load.
''' </summary>
''' <returns>An integer that holds the CPU load percentage.</returns>
''' <exception cref="NotSupportedException">One of the system calls fails. The CPU time can not be obtained.</exception>
Public Function Query() As Integer
Dim timeInfo(31) As Byte ' SYSTEM_TIME_INFORMATION structure
Dim perfInfo(311) As Byte ' SYSTEM_PERFORMANCE_INFORMATION structure ' get new system time
Dim ret As Integer = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, timeInfo, timeInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get new CPU's idle time
ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, perfInfo, perfInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' CurrentValue = NewValue - OldValue
Dim dbIdleTime As Double = BitConverter.ToInt64(perfInfo, 0) - _oldIdleTime
Dim dbSystemTime As Double = BitConverter.ToInt64(timeInfo, 8) - _oldSystemTime
' CurrentCpuIdle = IdleTime / SystemTime
If dbSystemTime <> 0 Then
dbIdleTime = dbIdleTime / dbSystemTime
End If
' CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / _processorCount + 0.5
' store new CPU's idle and system time
_oldIdleTime = BitConverter.ToInt64(perfInfo, 0) ' SYSTEM_PERFORMANCE_INFORMATION.liIdleTime
_oldSystemTime = BitConverter.ToInt64(timeInfo, 8) ' SYSTEM_TIME_INFORMATION.liKeSystemTime
Return CInt(Fix(dbIdleTime))
End Function ''' <summary>
''' NtQuerySystemInformation is an internal Windows function that retrieves various kinds of system information.
''' </summary>
''' <param name="dwInfoType">One of the values enumerated in SYSTEM_INFORMATION_CLASS, indicating the kind of system information to be retrieved.</param>
''' <param name="lpStructure">Points to a buffer where the requested information is to be returned. The size and structure of this information varies depending on the value of the SystemInformationClass parameter.</param>
''' <param name="dwSize">Length of the buffer pointed to by the SystemInformation parameter.</param>
''' <param name="returnLength">Optional pointer to a location where the function writes the actual size of the information requested.</param>
''' <returns>Returns a success NTSTATUS if successful, and an NTSTATUS error code otherwise.</returns>
<DllImport("ntdll", EntryPoint:="NtQuerySystemInformation")>
Private Shared Function NtQuerySystemInformation(ByVal dwInfoType As Integer,
ByVal lpStructure() As Byte,
ByVal dwSize As Integer,
ByVal returnLength As IntPtr) As Integer
End Function ''' <summary>Returns the number of processors in the system in a SYSTEM_BASIC_INFORMATION structure.</summary>
Private Const SYSTEM_BASICINFORMATION As Integer = 0
''' <summary>Returns an opaque SYSTEM_PERFORMANCE_INFORMATION structure.</summary>
Private Const SYSTEM_PERFORMANCEINFORMATION As Integer = 2
''' <summary>Returns an opaque SYSTEM_TIMEOFDAY_INFORMATION structure.</summary>
Private Const SYSTEM_TIMEINFORMATION As Integer = 3
''' <summary>The value returned by NtQuerySystemInformation is no error occurred.</summary>
Private Const NO_ERROR As Integer = 0
''' <summary>Holds the old idle time.</summary>
Private _oldIdleTime As Long
''' <summary>Holds the old system time.</summary>
Private _oldSystemTime As Long
''' <summary>Holds the number of processors in the system.</summary>
Private _processorCount As Double
End Class

CpuUsageNt

 1 Private NotInheritable Class MemUsage
2 <StructLayout(LayoutKind.Sequential)>
3 Private Structure MEMORY_INFO
4 ''' <summary>
5 ''' 当前结构体大小
6 ''' </summary>
7 Public dwLength As UInteger
8 ''' <summary>
9 ''' 当前内存使用率
10 ''' </summary>
11 Public dwMemoryLoad As UInteger
12 ''' <summary>
13 ''' 总计物理内存大小
14 ''' </summary>
15 Public dwTotalPhys As UInteger
16 ''' <summary>
17 ''' 可用物理内存大小
18 ''' </summary>
19 Public dwAvailPhys As UInteger
20 ''' <summary>
21 ''' 总计交换文件大小
22 ''' </summary>
23 Public dwTotalPageFile As UInteger
24 ''' <summary>
25 ''' 可用交换文件大小
26 ''' </summary>
27 Public dwAvailPageFile As UInteger
28 ''' <summary>
29 ''' 总计虚拟内存大小
30 ''' </summary>
31 Public dwTotalVirtual As UInteger
32 ''' <summary>
33 ''' 可用虚拟内存大小
34 ''' </summary>
35 Public dwAvailVirtual As UInteger
36 End Structure
37 <DllImport("kernel32")>
38 Private Shared Sub GlobalMemoryStatus(ByRef meminfo As MEMORY_INFO)
39 End Sub
40
41 Public Function Query() As Int32
42 Dim iRet As Int32 = 0
43 Try
44 Dim MemInfo As New MEMORY_INFO
45 GlobalMemoryStatus(MemInfo)
46 iRet = CInt(MemInfo.dwMemoryLoad)
47 Debug.Print("[DEBUG] GlobalMemoryStatus dwMemoryLoad={0}", iRet)
48 Catch ex As Exception
49 Debug.Print("[WARN ] GlobalMemoryStatus Err:{0}", ex.Message)
50 End Try
51 Return iRet
52 End Function
53
54 ''' <summary>
55 ''' 格式化容量大小
56 ''' </summary>
57 ''' <param name="size">容量(B)</param>
58 ''' <returns>已格式化的容量</returns>
59 Private Shared Function FormatSize(ByVal size As Double) As String
60 Dim d As Double = size
61 Dim i As Integer = 0
62 Do While (d > 1024) AndAlso (i < 5)
63 d /= 1024
64 i += 1
65 Loop
66 Dim unit() As String = {"B", "KB", "MB", "GB", "TB"}
67 Return (String.Format("{0} {1}", Math.Round(d, 2), unit(i)))
68 End Function
69 End Class

MemUsage

参考资料

1.C#获得Cpu使用率

2.c# 获取某一个进程的cpu和内存使用情况

VB.NET 在 Windows下通过WIn32API获取CPU和内存的使用率的更多相关文章

  1. Linux下使用java获取cpu、内存使用率

    原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系统中可以用top命令查看进程使用CPU和内存情况,通过Runtime类 ...

  2. 方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  3. 获取CPU和内存的使用率

    1.获取CPU的使用率 主要就是一个计算. int CUseRate::GetCPUUseRate() //获取CPU使用率 { ; FILETIME ftIdle, ftKernel, ftUser ...

  4. Linux下查看内核、CPU、内存及各组件版本的命令和方法

    Linux下查看内核.CPU.内存及各组件版本的命令和方法 Linux查看内核版本: uname -a                        more /etc/*release       ...

  5. C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率

    C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率: 先看界面: 建一个 Windows Form  桌面程序,代码如下: using System; using Sys ...

  6. Golang获取CPU、内存、硬盘使用率

    Golang获取CPU.内存.硬盘使用率 工具包 go get github.com/shirou/gopsutil 实现 func GetCpuPercent() float64 { percent ...

  7. Android获取cpu和内存信息、网址的代码

      android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...

  8. Python获取CPU、内存使用率以及网络使用状态代码

    Python获取CPU.内存使用率以及网络使用状态代码_python_脚本之家 http://www.jb51.net/article/134714.htm

  9. Linux下java获取CPU、内存、磁盘IO、网络带宽使用率

    一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...

  10. windows下配置tomcat服务器的jvm内存大小的两种方式

    难得遇到一次java堆内存溢出(心里想着,终于可以来一次jvm性能优化了$$) 先看下报错信息, java.lang.OutOfMemoryError: GC overhead limit excee ...

随机推荐

  1. macOS 常用键盘快捷键

    macOS 常用键盘快捷键大全 - 最值得你记住的 Mac 常用快捷键组合 Pertim 与 Windows 的差异 一切开始前,我们先来认识一下苹果 Mac 键盘上几个陌生的按键,比如 ⌘ (Com ...

  2. ansible 部署hadoop

    规划 ansible 节点 ansible controller 镜像rhel 8.2 镜像ansible hadoop 集群 master slave1 slave2 镜像centos 1810 0 ...

  3. Jmeter参数化4-数据库数据引入

    1. 下载jmeter依赖的mysql驱动包 jmeter要连接mysql数据库,首先得下载mysql驱动包.执行"select version()"查看数据库版本 mysql历史 ...

  4. JDBC详解学习笔记

    JDBC简介 架构时--没有什么是加一层解决不了的,如果有,就再加一层. 如tomcat集群上面的Nginx,Nginx集群上面的LVS. JDBC是数据库驱动的接口规范,是SUN公司未来简化开发人员 ...

  5. ubuntu编译软件报错:fatal error: libnet.h: No such file or directory

    参考: https://blog.csdn.net/wuyou1995/article/details/104742326/ ------------------------------------- ...

  6. 使用map方法递归替换组数对象内的某一个值

    const TreeDataSource = (arr) => { // 判断是否是数组 if (!arr || !arr.length > 0) { return } // 将值存入ma ...

  7. Unity FpsSample Demo研究

    1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示MLAPI(NetCode前身)+DOTS的一个FPS多人对战Demo. Demo下载地址(需要安装Git LFS) ...

  8. 「TCP/UDP」一个端口号可以同时被两个进程绑定吗?

    一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...

  9. mysql 5.7密码修改

    官网下载安装包:https://dev.mysql.com/downloads/mysql/ 一.停止mysqld服务 二.编辑配置文件 有的Linux版本是/etc/my.cnf 有的Linux版本 ...

  10. 十五张图带你快速入门 shardingsphere-proxy

    Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品: ShardingSphere-Proxy ShardingSphere-JDBC 很多同学对于 Shardi ...