CraigSD 2025-04-27 08:15 采纳率: 98.2%
浏览 140
已采纳

C# 如何获取电脑的CPU使用率、内存占用和磁盘信息?

**如何使用C#准确获取电脑的CPU使用率、内存占用和磁盘信息?** 在C#中,如何实时监控系统资源,包括CPU使用率、内存占用和磁盘信息?许多开发者尝试使用`PerformanceCounter`类获取CPU和内存数据,但对于初学者来说,可能会遇到性能计数器名称不匹配或返回值异常的问题。此外,磁盘信息的获取通常依赖于`DriveInfo`类,但如何过滤无效驱动器(如不存在的网络驱动器)并正确显示磁盘空间(已用/可用)也是一个常见难点。如何确保跨平台兼容性(如.NET Core/.NET 5+),同时避免因权限不足导致的数据获取失败?请分享一个完整且高效的解决方案。
  • 写回答

1条回答 默认 最新

  • 火星没有北极熊 2025-04-27 08:15
    关注

    1. 问题概述

    在C#中,实时监控系统资源(如CPU使用率、内存占用和磁盘信息)是一个常见的需求。然而,初学者可能会遇到性能计数器名称不匹配或返回值异常的问题。此外,如何正确过滤无效驱动器并显示磁盘空间也是一个难点。本解决方案将从以下几个方面进行深入探讨:

    • 如何使用`PerformanceCounter`类获取CPU和内存数据。
    • 如何使用`DriveInfo`类获取磁盘信息,并过滤无效驱动器。
    • 确保跨平台兼容性(如.NET Core/.NET 5+)。
    • 避免因权限不足导致的数据获取失败。

    通过逐步分析和提供完整代码示例,我们将帮助开发者解决这些问题。

    2. 获取CPU使用率

    `PerformanceCounter`类是C#中获取CPU使用率的主要工具。以下是一个简单的步骤说明:

    1. 创建一个`PerformanceCounter`实例,指定类别为"Processor",计数器为"% Processor Time"。
    2. 设置实例的实例名称为"_Total"以获取所有CPU核心的平均使用率。
    3. 调用`NextValue()`方法两次,间隔至少一秒钟,以获得准确的CPU使用率。
    
    using System;
    using System.Diagnostics;
    
    class Program
    {
        static void Main()
        {
            PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
            Console.WriteLine("CPU Usage: " + cpuCounter.NextValue() + "%");
            System.Threading.Thread.Sleep(1000); // 等待一秒以确保准确读取
            Console.WriteLine("CPU Usage: " + cpuCounter.NextValue() + "%");
        }
    }
        

    注意:如果运行时出现权限问题,可能需要以管理员身份运行程序。

    3. 获取内存占用

    内存占用可以通过`PerformanceCounter`类中的"Memory"类别来获取。以下是具体实现:

    类别计数器说明
    MemoryAvailable MBytes可用内存(单位:MB)。
    MemoryCommitted Bytes已提交的内存总量。
    
    using System;
    using System.Diagnostics;
    
    class Program
    {
        static void Main()
        {
            PerformanceCounter memoryCounter = new PerformanceCounter("Memory", "Available MBytes");
            Console.WriteLine("Available Memory: " + memoryCounter.NextValue() + " MB");
        }
    }
        

    对于更复杂的内存统计,可以结合其他计数器进行计算。

    4. 获取磁盘信息

    `DriveInfo`类可以用于获取磁盘信息。为了过滤无效驱动器(如不存在的网络驱动器),我们可以检查驱动器类型和可用空间:

    
    using System;
    using System.IO;
    
    class Program
    {
        static void Main()
        {
            DriveInfo[] allDrives = DriveInfo.GetDrives();
            foreach (var drive in allDrives)
            {
                if (drive.IsReady && drive.DriveType == DriveType.Fixed) // 过滤固定磁盘
                {
                    Console.WriteLine($"Drive: {drive.Name}");
                    Console.WriteLine($"Total Size: {drive.TotalSize / 1024 / 1024} MB");
                    Console.WriteLine($"Free Space: {drive.AvailableFreeSpace / 1024 / 1024} MB");
                }
            }
        }
    }
        

    此代码仅显示已准备好且为固定类型的磁盘信息。

    5. 跨平台兼容性和权限问题

    在.NET Core/.NET 5+中,确保跨平台兼容性需要注意以下几点:

    • 使用`System.Diagnostics.PerformanceCounter`时,某些操作系统可能不支持性能计数器。在这种情况下,可以考虑使用第三方库(如`sigar`)。
    • 对于Linux和macOS,可能需要额外的权限配置才能访问性能计数器。

    以下是处理权限问题的一个流程图:

    graph TD; A[开始] --> B{是否有权限?}; B --是--> C[正常获取数据]; B --否--> D[提示用户提升权限]; D --> E[重新尝试获取数据];
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 4月27日