0

0

C#怎么获取某个进程的CPU占用率_C#如何监控特定程序性能【技巧】

冰火之心

冰火之心

发布时间:2026-03-19 08:35:32

|

908人浏览过

|

来源于php中文网

原创

Process.TotalProcessorTime返回的是进程累计CPU时间,非实时百分比;正确方法需同时采集进程与系统总CPU时间并归一化计算,推荐用PerformanceCounter或WMI实现。

Process.TotalProcessorTime 返回的不是实时CPU百分比

很多人直接用 process.totalprocessortime 减两次差值再除以时间间隔,以为能算出cpu占用率——这是错的。它返回的是进程累计使用的cpu时间(timespan),不是百分比,也不包含系统总cpu时间基准,单独用它没法得出“占用了多少%的cpu”。

正确做法是:必须同时采集进程的CPU时间和系统整体的CPU时间(通过 PerformanceCounter 或 WMI),做归一化计算。Windows本身没有提供单进程“瞬时CPU%”的轻量API,所有靠谱方案都绕不开采样+对比。

  • 采样间隔至少 500ms,太短会导致精度崩坏(尤其多核下)
  • PerformanceCounter 初始化慢、首次读值常为0或报错,需加 NextValue() 预热
  • 不同Windows版本对 "Process\% Processor Time" 计数器的支持略有差异,Win10/11基本稳定,Server 2012+建议用WMI兜底

用 PerformanceCounter 获取进程CPU使用率(推荐方案)

这是最常用、开销可控、.NET原生支持的方式。关键在于选对计数器路径和实例名,并处理好进程生命周期变化。

示例逻辑:

var counter = new PerformanceCounter(
    "Process", 
    "% Processor Time", 
    "notepad"); // 进程名,不含.exe
counter.NextValue(); // 预热,丢弃第一次无效值
Thread.Sleep(500);
float cpuPercent = counter.NextValue(); // 实际值,单位是 % * 100(即 12.34 表示 12.34%)
  • 实例名填进程主模块名(如 chromedevenv),不是窗口标题,也不是完整路径
  • 若进程已退出,NextValue() 会抛 InvalidOperationException,必须 try-catch
  • 同一进程多个实例(如多个 chrome.exe)会汇总到一个计数器里;要区分具体实例,得用 WMI 或遍历 Process.GetProcessesByName() + PID 绑定
  • 计数器名称大小写敏感,"% Processor Time" 中的空格和%不能少

用 WMI 查询指定PID的CPU使用率(跨版本兼容更强)

PerformanceCounter 在某些环境(如容器、低权限服务账户)下不可用时,WMI是更鲁棒的选择,但性能略低、查询稍慢。

Felvin
Felvin

AI无代码市场,只需一个提示快速构建应用程序

下载

核心是查 Win32_PerfFormattedData_PerfProc_Process 类,过滤 IdProcess 字段:

var query = $"SELECT PercentProcessorTime FROM Win32_PerfFormattedData_PerfProc_Process WHERE IdProcess = {pid}";
using var searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject obj in searcher.Get()) {
    int pct = Convert.ToInt32(obj["PercentProcessorTime"]);
}
  • 返回值已是百分比整数(0–100),无需再除以核数或归一化
  • WMI查询可能超时,建议设 searcher.Options.Timeout = TimeSpan.FromSeconds(2)
  • 需要引用 System.Management,.NET Core/.NET 5+ 需额外安装 System.Management NuGet 包
  • 注意:WMI在Windows Server Core或Nano Server上默认禁用,生产环境需确认策略

监控多进程时别漏掉“进程名冲突”和“PID复用”问题

用名字查进程(如 Process.GetProcessesByName("chrome"))再拿PID去配CPU数据,看似自然,实则埋了两个坑:

  • 多个同名进程存在时,GetProcessesByName 返回数组,但你可能只取了第一个,结果监控对象错位
  • 进程退出后PID可能被新进程快速复用,若你缓存了旧PID对应的 PerformanceCounter 实例,后续读出来的就是另一个程序的数据
  • 更稳的做法:启动监控时记录进程的 StartTimeId,每次采样前先用 Process.GetProcessById(pid) 确认是否还存活且 StartTime 一致
  • 如果目标程序启动频繁(如CI任务中的临时进程),建议放弃名字匹配,改用启动命令行关键字或父进程关系来识别

实际跑起来你会发现,最难的不是算百分比,而是让“哪个进程”的定义在整段时间内保持稳定。名字会重、PID会复用、计数器实例会失效——这些边界情况不处理,监控数据看起来平滑,其实全是噪声。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

279

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

185

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

327

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

380

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

29

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

107

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

416

2026.03.11

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

381

2025.12.24

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

22

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号