如何让C#程序在Windows 10控制台显示自身占用的资源?
嘿,作为C#新手就想着监控自己程序的资源占用,这个思路超实用!在Windows 10上,咱们完全可以用.NET自带的类库实现,不需要额外安装任何包,下面一步步给你讲清楚:
核心原理
咱们要用到System.Diagnostics命名空间下的Process类——它能直接获取当前运行程序(也就是自身进程)的所有资源使用数据,非常方便。
完整代码示例
直接上可运行的代码,每一行都加了注释,你复制到Visual Studio或者Rider里就能跑:
using System; using System.Diagnostics; using System.Threading; namespace ResourceMonitor { class Program { static void Main(string[] args) { // 获取当前程序的进程实例,用using自动释放资源 using (Process currentProcess = Process.GetCurrentProcess()) { // 记录上一次的CPU总耗时,用来计算实时使用率 TimeSpan previousCpuTime = currentProcess.TotalProcessorTime; DateTime previousTime = DateTime.Now; Console.WriteLine("=== 当前程序资源占用监控 ==="); Console.WriteLine("按任意键停止监控...\n"); // 循环刷新数据,直到用户按键 while (!Console.KeyAvailable) { // 等待1秒,避免刷新太快看不清 Thread.Sleep(1000); // 必须调用Refresh方法,才能获取最新的进程数据 currentProcess.Refresh(); // 计算CPU使用率:通过两次采样的耗时差值,结合时间差和CPU核心数得出 TimeSpan currentCpuTime = currentProcess.TotalProcessorTime; DateTime currentTime = DateTime.Now; double cpuUsage = (currentCpuTime - previousCpuTime).TotalMilliseconds / (currentTime - previousTime).TotalMilliseconds / Environment.ProcessorCount * 100; // 把字节转换成MB,方便阅读 double physicalMemoryMB = currentProcess.WorkingSet64 / (1024 * 1024); double privateMemoryMB = currentProcess.PrivateMemorySize64 / (1024 * 1024); // 清屏并打印最新数据 Console.Clear(); Console.WriteLine("=== 当前程序资源占用监控 ==="); Console.WriteLine("按任意键停止监控...\n"); Console.WriteLine($"CPU使用率: {cpuUsage:F1}%"); Console.WriteLine($"物理内存占用: {physicalMemoryMB:F1} MB"); Console.WriteLine($"私有内存占用: {privateMemoryMB:F1} MB"); Console.WriteLine($"当前线程数: {currentProcess.Threads.Count}"); Console.WriteLine($"当前句柄数: {currentProcess.HandleCount}"); // 更新上次的时间和CPU耗时,用于下一次计算 previousCpuTime = currentCpuTime; previousTime = currentTime; } } } } }
关键参数说明
给你解释下代码里用到的几个核心资源指标:
- CPU使用率:这里通过计算两次采样的CPU耗时差值来得到实时使用率,比直接读属性更准确(因为直接读的是进程启动以来的总耗时)
- 物理内存(WorkingSet64):程序当前实际占用的物理内存(和任务管理器里的"内存"列对应)
- 私有内存(PrivateMemorySize64):程序独占的内存,不包括和其他进程共享的部分
- 线程数/句柄数:分别是当前程序运行的线程数量和打开的系统句柄数量,这些都是排查程序性能问题的常用指标
小提示
- 如果你不想清屏刷新,可以把
Console.Clear()去掉,让数据逐行打印 - 要是想监控其他资源(比如IO读写、页面错误),可以看看
Process类的其他属性,比如IOReadBytes、IOWriteBytes,用法和上面的参数类似 - 运行程序的时候不需要特殊权限,因为咱们只是读取自身进程的信息,系统默认允许
内容的提问来源于stack exchange,提问作者RedstoneUmbreon
相关产品推荐
相关产品推荐

