有没有办法通过。net / c#找到CPU核数?
PS:这是一个直接的代码问题,不是一个“我应该使用多线程吗?”的问题!: -)
有没有办法通过。net / c#找到CPU核数?
PS:这是一个直接的代码问题,不是一个“我应该使用多线程吗?”的问题!: -)
当前回答
我正在寻找同样的事情,但我不想安装任何nuget或服务包,所以我找到了这个解决方案,这是相当简单和直接的, 使用这个讨论,我认为运行WMIC命令并获得该值会很容易,下面是c#代码。你只需要使用系统。管理名称空间(以及用于进程等的更多标准名称空间)。
string fileName = Path.Combine(Environment.SystemDirectory, "wbem", "wmic.exe");
string arguments = @"cpu get NumberOfCores";
Process process = new Process
{
StartInfo =
{
FileName = fileName,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
}
};
process.Start();
StreamReader output = process.StandardOutput;
Console.WriteLine(output.ReadToEnd());
process.WaitForExit();
int exitCode = process.ExitCode;
process.Close();
其他回答
一种选择是从注册中心读取数据。 MSDN文章主题:http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.localmachine(v=vs.71).aspx)
处理器,我相信可以在这里,HKEY_LOCAL_MACHINE\硬件\描述\系统\中央处理器
private void determineNumberOfProcessCores()
{
RegistryKey rk = Registry.LocalMachine;
String[] subKeys = rk.OpenSubKey("HARDWARE").OpenSubKey("DESCRIPTION").OpenSubKey("System").OpenSubKey("CentralProcessor").GetSubKeyNames();
textBox1.Text = "Total number of cores:" + subKeys.Length.ToString();
}
我相当肯定大多数系统上都有这个注册表项。
我想把我的0.02美元投进去。
WMI查询很慢,所以尽量只选择所需的成员,而不是使用Select *。
查询时间为3.4s:
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
而这个需要0.122秒:
foreach (var item in new System.Management.ManagementObjectSearcher("Select NumberOfCores from Win32_Processor").Get())
我正在寻找同样的事情,但我不想安装任何nuget或服务包,所以我找到了这个解决方案,这是相当简单和直接的, 使用这个讨论,我认为运行WMIC命令并获得该值会很容易,下面是c#代码。你只需要使用系统。管理名称空间(以及用于进程等的更多标准名称空间)。
string fileName = Path.Combine(Environment.SystemDirectory, "wbem", "wmic.exe");
string arguments = @"cpu get NumberOfCores";
Process process = new Process
{
StartInfo =
{
FileName = fileName,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
}
};
process.Start();
StreamReader output = process.StandardOutput;
Console.WriteLine(output.ReadToEnd());
process.WaitForExit();
int exitCode = process.ExitCode;
process.Close();
你可以使用这个类:
public static class CpuCores
{
private static int cores = 0;
public static int Number
{
get
{
if (cores > 0) return cores;
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" +
"{50127dc3-0f36-415e-a6cc-4cb3be910b65}");
if (key == null)
{
cores = Environment.ProcessorCount;
return cores;
}
string[] subkeys = key.GetSubKeyNames();
key.Close();
cores = 0;
if (subkeys != null && subkeys.Length > 0) foreach (string s in subkeys)
{
if (s.Length != 4) continue;
int n;
if (int.TryParse(s, out n) && ++n > cores) cores = n;
}
if (cores <= 0) cores = Environment.ProcessorCount;
return cores;
}
}
}
Environment.ProcessorCount
(文档)