在C#开发中,获取CPU核心数是一个常见的需求,尤其是在进行多线程编程、性能调优或者资源分配时,了解CPU的核心数量可以帮助开发者更合理地设计程序逻辑,避免资源浪费或者性能瓶颈。

方法一:通过Environment类获取
Environment类提供了很多系统环境相关的属性,其中ProcessorCount属性可以直接返回当前计算机上的CPU核心数,这是最简便的一种方式,不需要额外引用其他命名空间,适用于大多数常规场景。
using System;
class Program
{
static void Main()
{
// 获取CPU核心数
int coreCount = Environment.ProcessorCount;
Console.WriteLine($"当前CPU核心数为:{coreCount}");
}
}
这种方式获取的是逻辑核心数,如果CPU支持超线程技术,返回的数值会是物理核心数乘以超线程倍数的结果。比如一个4核8线程的CPU,这里会返回8。
方法二:通过System.Management获取物理核心数
如果需要获取物理核心数,而不是逻辑核心数,就需要借助System.Management命名空间来查询系统的硬件信息,这种方式需要额外添加对应的程序集引用。
首先在项目中添加对System.Management的引用,然后可以通过以下代码获取物理核心数:
using System;
using System.Management;
class Program
{
static void Main()
{
int physicalCoreCount = 0;
// 查询CPU相关信息
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
foreach (ManagementObject mo in searcher.Get())
{
// NumberOfCores是物理核心数,NumberOfLogicalProcessors是逻辑核心数
physicalCoreCount += Convert.ToInt32(mo["NumberOfCores"]);
}
Console.WriteLine($"当前CPU物理核心数为:{physicalCoreCount}");
}
}
这种方式只能在Windows系统上运行,在非Windows系统中使用会抛出异常,所以跨平台场景下不建议使用这种方法。
方法三:通过Process类获取当前进程可用的核心数
有时候我们不需要整个系统的CPU核心数,而是需要知道当前进程可以使用的CPU核心数,这时候可以通过Process类来获取相关信息。
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
// 获取当前进程
Process currentProcess = Process.GetCurrentProcess();
// 获取进程可用的核心数,返回的是关联的处理器掩码对应的核心数
int availableCoreCount = 0;
IntPtr processorAffinity = currentProcess.ProcessorAffinity;
// 遍历掩码的每一位,统计为1的位数就是可用的核心数
while (processorAffinity != IntPtr.Zero)
{
if ((processorAffinity.ToInt64() & 1) == 1)
{
availableCoreCount++;
}
processorAffinity = new IntPtr(processorAffinity.ToInt64() >> 1);
}
Console.WriteLine($"当前进程可用的CPU核心数为:{availableCoreCount}");
}
}
这种方式获取的是当前进程被限制可以使用的核心数,如果系统没有对进程做核心绑定限制,通常结果和Environment.ProcessorCount一致。
不同方法的对比
下面通过表格对比三种方法的差异,方便开发者选择合适的方案:
| 方法 | 获取类型 | 跨平台性 | 实现复杂度 |
|---|---|---|---|
| Environment.ProcessorCount | 逻辑核心数 | 支持所有.NET支持的平台 | 简单,无需额外引用 |
| System.Management查询 | 物理核心数 | 仅支持Windows | 中等,需要添加程序集引用 |
| Process类计算 | 进程可用核心数 | 支持所有.NET支持的平台 | 中等,需要位运算处理 |
在实际开发中,大部分场景使用Environment.ProcessorCount就可以满足需求,如果需要物理核心数且只在Windows平台运行,可以选择System.Management的方式,如果需要获取进程可用的核心数,则可以使用Process类的方法。
C#CPU核心数EnvironmentSystem.ManagementProcess修改时间:2026-06-21 15:12:25