C#怎么判断进程是否在运行_C#如何管理系统进程【必备】

穿越時空

穿越時空

2026-03-30

917人浏览

原创

用process.getprocessesbyname判断进程存在需注意:只匹配无后缀名、大小写建议小写、结果长度>0才存在;getprocessbyid需捕获argumentexception和invalidoperationexception;hasexited为false不保证进程正常响应,gui进程应加responding检查。

怎么用 process.getprocessesbyname 判断进程是否存在

直接查进程名是最常用也最容易出错的方式。它不看路径、不看用户上下文,只匹配 process.processname(即去掉 .exe 后缀的名称),所以 notepad 能匹配 notepad.exe,但也会误匹配 notepad_plusplus.exe(如果名字含子串)。

实操建议:

  • 始终用 Process.GetProcessesByName("chrome") 而不是 Process.GetProcessesByName("chrome.exe") —— 后者会返回空数组
  • 检查结果长度:if (Process.GetProcessesByName("explorer").Length > 0),别用 != null,这个方法从不返回 null
  • 注意大小写:Windows 上通常不敏感,但某些容器或模拟环境可能敏感,建议统一用小写比对
  • 权限问题:跨用户进程(如系统服务启动的进程)在非管理员权限下可能查不到,Access denied 错误不会抛异常,而是直接不出现在结果里

为什么 Process.GetProcessById 会抛 ArgumentException

这不是“进程不存在”的信号,而是你传了个根本没用过的 PID,或者该 PID 曾经存在但已退出、被复用——Windows 的 PID 是可重用的,且重用前有短暂空窗期。

常见错误现象:

  • 刚杀掉一个进程,立刻用它的 PID 去 GetProcessById,报 ArgumentException: The parameter is incorrect
  • 缓存了某个进程的 PID,几秒后去查,发现报错,其实进程早死了,PID 被新进程占用了

正确做法是加 try-catch,并把 ArgumentExceptionInvalidOperationException(进程已退出)都视为“进程不可用”:

try {
    var p = Process.GetProcessById(pid);
    return !p.HasExited; // 注意:即使拿到对象,也要再 check HasExited
} catch (ArgumentException) {
    return false;
} catch (InvalidOperationException) {
    return false;
}

判断进程是否“真正运行中”:不能只看 HasExited == false

HasExited 返回 false 只代表内核对象还在,不代表进程响应正常。比如 GUI 进程卡死、后台服务假死、或处于挂起状态,HasExited 依然为 false

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载

使用场景决定你需要多深的探测:

  • 简单存活检测:查 HasExited + Responding(仅限有窗口的进程,如 notepad
  • 服务类进程(无窗口):得靠 IPC、端口监听、或心跳文件,C# 自身 API 没法判断它是否“逻辑上活着”
  • 避免误判:不要依赖 StartTime 是否“很老”,有些服务启动后长期不更新时间戳

示例(带响应性检查):

var ps = Process.GetProcessesByName("devenv");
if (ps.Length > 0 && !ps[0].HasExited && ps[0].Responding) {
    // 这才算“活得好”
}

64位系统上查 32位进程要注意什么

没有额外注意事项 —— Process 类本身不区分位数。但容易踩的坑在路径和模块加载上:

  • Process.MainModule.FileName 在 32 位进程里可能返回 C:\Windows\SysWOW64\...,而你以为是 System32;反过来,64 位进程读 System32 才是真 System32
  • 如果你用 Process.Modules 遍历 DLL,32 位进程看不到 64 位模块,反之亦然 —— 但这不影响“是否存在”的判断
  • 真正影响判断的是:某些杀毒软件或沙箱会拦截 EnumProcesses 系统调用,导致 GetProcessesByName 返回空,哪怕进程明明在跑

这种拦截无法绕过,只能换方案:比如检查目标进程是否监听了某个已知端口,或读取其创建的互斥体(Mutex.OpenExisting)。

进程判断这事,表面是 API 调用,实际是跟操作系统、权限模型、甚至安全软件博弈。最稳的路不是“查一次就信”,而是结合名称、PID 生命周期、响应性、外部信号,交叉验证。尤其在自动化脚本或看门狗逻辑里,单点判断失败率远高于预期。

相关专题

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

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

2023.08.08

528

5

什么是c#
什么是c#

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

2023.08.31

1157

3

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

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

2024.03.13

556

8

C#Task用法
C#Task用法

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

2024.03.14

1050

11

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

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

2026.02.03

148

18

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

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

2026.02.06

202

20

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

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

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

137

20

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

2025.12.01

321

16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习