Как найти Количество Ядер процессора через.NET/C#?

Можно генерировать сериализуемые классы C# из схемы (xsd) использование xsd.exe:

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir

, Если схема имеет зависимости (включал/импортировал схемы), они должны все быть включены в ту же командную строку.

297
задан carefulnow1 24 August 2016 в 12:10
поделиться

3 ответа

Есть несколько различных частей информации, относящихся к процессорам, которые вы можете получить:

  1. Количество физических процессоров
  2. Количество ядер
  3. Количество логических процессоров.

Все они могут быть разными; в случае машины с 2 двухъядерными процессорами с поддержкой гиперпоточности, имеется 2 физических процессора, 4 ядра и 8 логических процессоров.

Количество логических процессоров доступно через класс Environment , но другая информация доступна только через WMI (и вам, возможно, придется установить некоторые исправления или службу packs , чтобы получить его в некоторых системах):

Не забудьте добавить в свой проект ссылку на System.Management.dll

Физические процессоры:

foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("Number Of Physical Processors: {0} ", item["NumberOfProcessors"]);
}

Ядра:

int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
    coreCount += int.Parse(item["NumberOfCores"].ToString());
}
Console.WriteLine("Number Of Cores: {0}", coreCount);

Логические процессоры:

Console.WriteLine("Number Of Logical Processors: {0}", Environment.ProcessorCount);

ИЛИ

foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("Number Of Logical Processors: {0}", item["NumberOfLogicalProcessors"]);
}

Процессоры, исключенные из Windows:

Вы также можете использовать вызовы Windows API в setupapi.dll для обнаружения процессоров, которые были исключены из Windows (например, с помощью настроек загрузки) и не обнаруживаются с помощью вышеупомянутые средства. В приведенном ниже коде указано общее количество существующих логических процессоров (я не смог понять, как отличить физические процессоры от логических), включая те, которые были исключены из Windows:

static void Main(string[] args)
{
    int deviceCount = 0;
    IntPtr deviceList = IntPtr.Zero;
    // GUID for processor classid
    Guid processorGuid = new Guid("{50127dc3-0f36-415e-a6cc-4cb3be910b65}");

    try
    {
        // get a list of all processor devices
        deviceList = SetupDiGetClassDevs(ref processorGuid, "ACPI", IntPtr.Zero, (int)DIGCF.PRESENT);
        // attempt to process each item in the list
        for (int deviceNumber = 0; ; deviceNumber++)
        {
            SP_DEVINFO_DATA deviceInfo = new SP_DEVINFO_DATA();
            deviceInfo.cbSize = Marshal.SizeOf(deviceInfo);

            // attempt to read the device info from the list, if this fails, we're at the end of the list
            if (!SetupDiEnumDeviceInfo(deviceList, deviceNumber, ref deviceInfo))
            {
                deviceCount = deviceNumber - 1;
                break;
            }
        }
    }
    finally
    {
        if (deviceList != IntPtr.Zero) { SetupDiDestroyDeviceInfoList(deviceList); }
    }
    Console.WriteLine("Number of cores: {0}", deviceCount);
}

[DllImport("setupapi.dll", SetLastError = true)]
private static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid,
    [MarshalAs(UnmanagedType.LPStr)]String enumerator,
    IntPtr hwndParent,
    Int32 Flags);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern Int32 SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet,
    Int32 MemberIndex,
    ref SP_DEVINFO_DATA DeviceInterfaceData);

[StructLayout(LayoutKind.Sequential)]
private struct SP_DEVINFO_DATA
{
    public int cbSize;
    public Guid ClassGuid;
    public uint DevInst;
    public IntPtr Reserved;
}

private enum DIGCF
{
    DEFAULT = 0x1,
    PRESENT = 0x2,
    ALLCLASSES = 0x4,
    PROFILE = 0x8,
    DEVICEINTERFACE = 0x10,
}
455
ответ дан 23 November 2019 в 01:31
поделиться

Environment.ProcessorCount должна дать вам количество ядер на локальном компьютере.

20
ответ дан 23 November 2019 в 01:31
поделиться
Environment.ProcessorCount

[Документация]

197
ответ дан 23 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: