调用 wmi(仅限处理器)时如何修复缓慢的加载时间
How to fix slow load time when calling wmi(processor only)
我的 C# 应用程序遇到问题。
我正在使用 WMI 检索有关我的 CPU、GPU 和 RAM 的一些信息。
除了 CPU (Win32_Processor
).
我有一个菜单和每个不同的面板(CPU、RAM、GPU)。
起初我尝试的是在应用程序启动时加载所有信息,但效果不佳,加载时间很长。
其次,我尝试在面板可见时(单击按钮后)加载它们,这在 ram 和 gpu 面板上运行良好。
我对所有这些都使用了完全相同的代码。这是:
如果可能的话,我正在尝试使 cpu 信息加载速度与其他信息一样快,但是通过搜索和尝试我自己的东西,我无法做到这一点。
我确实意识到获取所有信息需要一些时间,需要那么多时间似乎很奇怪!
P.S:单击 cpu 面板按钮时的加载时间为 3.5 秒,单击 "specs" 按钮时仅显示最大频率、核心数、数据宽度、线程数、当前电压以及l2、l3大小需要8秒。
private void getinfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject mo in mos.Get())
{
string valuebro = Convert.ToString(mo[syntax]);
if (name == "CPUNAME")
{
CPUNAME.Text = valuebro;
}
else if (name == "CPUMAXFREQ")
{
//CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
maxfreqbro = Convert.ToInt32(valuebro);
}
else if (name == "CPUCURFREQ")
{
curfreqbro = Convert.ToInt32(valuebro);
CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
}
else if (name == "ThreadC")
{
THREADC.Text ="Threads: " + valuebro;
}
else if (name == "DataW")
{
DataW.Text = "Data Width: " +valuebro + " bit";
}
else if (name == "L2Size")
{
l2size = Convert.ToInt32(valuebro) / 1000;
L2Size.Text = "L2 Size: " + l2size.ToString() + " MB";
}
else if (name == "L3Size")
{
l3size = Convert.ToInt32(valuebro) / 1000;
L3Size.Text ="L3 Size: "+ l3size.ToString() + " MB";
}
else if (name == "NOC")
{
NoOfCores.Text = "Cores: " + valuebro;
}
else if (name == "VOLT")
{
voltage = Convert.ToDecimal(valuebro) / 10;
output = voltage.ToString();
CurrentVolt.Text = "Core Voltage: " + output + " V";
}
else if (name == "CPUSTATUS")
{
CPUSTATUS.Text = "Status: " + valuebro;
}
else if (name == "AVAIL")
{
Avail.Text = "Code: " + valuebro;
}
}
}
(内存)
private void raminfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher ram = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject rm in ram.Get())
{
string valueram = Convert.ToString(rm[syntax]);
if (name == "OED")
{
OEDRAM.Text = "" + valueram;
}
else if (name == "ERRINFO")
{
ErrInfoRam.Text = "Error code: " + valueram;
}
else if (name == "ERRDESC")
{
ErrDescRAM.Text = "" + valueram;
}
else if (name == "CCVOLT")
{
volts = Convert.ToDecimal(valueram) / 1000;
finaloutput = volts.ToString();
voltageram.Text = "Voltage: " +finaloutput + " V";
}
else if (name == "CCSPEED")
{
Currentspeed.Text = "Current Frequency: " + valueram + " Mhz";
}
else if (name == "SPEED")
{
speedram.Text = "Max Frequency: " + valueram + " Mhz";
}
else if (name == "CAPA")
{
Int64 capa = Convert.ToInt64(valueram) / 1024;
Int64 final = capa / 1024;
capacityram.Text = "Total memory: " + final + " MB";
}
}
}
(显卡)
private void gpuinfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher gpu = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject gp in gpu.Get())
{
string valuegpu = Convert.ToString(gp[syntax]);
if (name == "GPUNAME")
{
NameGPU.Text = valuegpu;
}
else if (name == "Availability")
{
AvailGPU.Text = "Status code: " + valuegpu;
}
else if (name == "CONFMEC")
{
CMEC.Text = "Error code: " + valuegpu;
}
else if (name == "DVer")
{
DriverVers.Text = "Driver Version: " + valuegpu;
}
else if (name == "ERDESC")
{
ErrDescr.Text = valuegpu;
}
else if (name == "ERRCLR")
{
ErrorClear.Text = valuegpu;
}
else if (name == "STAT")
{
StatusGPU.Text = "Status: " + valuegpu;
}
}
}
一个简单的更改将 WMI 查询过滤到所请求的字段,使我的查询速度提高了 100 多次:
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", $"SELECT {syntax} FROM " + hwclass);
但是,还是无缘无故的多次查询。可以编写一个更高效的版本,一次查询所有需要的字段,而且速度仍然快 3 倍。此版本包括其他建议的改进:
private void cpuinfos(List<string> dataElements) {
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", $"SELECT {String.Join(",", dataElements)} FROM Win32_Processor");
foreach (ManagementObject cpuInfo in mos.Get()) {
foreach (var anElementName in dataElements) {
string valuebro = Convert.ToString(cpuInfo[anElementName]);
switch (anElementName) {
case "Name":
CPUNAME.Text = valuebro;
break;
case "MaxClockSpeed":
//CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
maxfreqbro = Convert.ToInt32(valuebro);
break;
case "CurrentClockSpeed":
curfreqbro = Convert.ToInt32(valuebro);
CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
break;
case "ThreadCount":
THREADC.Text = "Threads: " + valuebro;
break;
case "DataWidth":
DataW.Text = "Data Width: " + valuebro + " bit";
break;
case "L2CacheSize":
l2size = Convert.ToInt32(valuebro) / 1000;
L2Size.Text = "L2 Size: " + l2size.ToString() + " MB";
break;
case "L3CacheSize":
l3size = Convert.ToInt32(valuebro) / 1000;
L3Size.Text = "L3 Size: " + l3size.ToString() + " MB";
break;
case "NumberOfCores":
NoOfCores.Text = "Cores: " + valuebro;
break;
case "CurrentVoltage":
voltage = Convert.ToDecimal(valuebro) / 10.0m;
output = voltage.ToString();
CurrentVolt.Text = "Core Voltage: " + output + " V";
break;
case "Status":
CPUSTATUS.Text = "Status: " + valuebro;
break;
case "Availability":
Avail.Text = "Code: " + valuebro;
break;
}
}
}
}
您可以通过传递要收集的值来使用它:
cpuinfos(new List<string>() { "Name", "MaxClockSpeed", "ThreadCount" });
我的 C# 应用程序遇到问题。
我正在使用 WMI 检索有关我的 CPU、GPU 和 RAM 的一些信息。
除了 CPU (Win32_Processor
).
我有一个菜单和每个不同的面板(CPU、RAM、GPU)。
起初我尝试的是在应用程序启动时加载所有信息,但效果不佳,加载时间很长。
其次,我尝试在面板可见时(单击按钮后)加载它们,这在 ram 和 gpu 面板上运行良好。
我对所有这些都使用了完全相同的代码。这是:
如果可能的话,我正在尝试使 cpu 信息加载速度与其他信息一样快,但是通过搜索和尝试我自己的东西,我无法做到这一点。
我确实意识到获取所有信息需要一些时间,需要那么多时间似乎很奇怪!
P.S:单击 cpu 面板按钮时的加载时间为 3.5 秒,单击 "specs" 按钮时仅显示最大频率、核心数、数据宽度、线程数、当前电压以及l2、l3大小需要8秒。
private void getinfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject mo in mos.Get())
{
string valuebro = Convert.ToString(mo[syntax]);
if (name == "CPUNAME")
{
CPUNAME.Text = valuebro;
}
else if (name == "CPUMAXFREQ")
{
//CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
maxfreqbro = Convert.ToInt32(valuebro);
}
else if (name == "CPUCURFREQ")
{
curfreqbro = Convert.ToInt32(valuebro);
CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
}
else if (name == "ThreadC")
{
THREADC.Text ="Threads: " + valuebro;
}
else if (name == "DataW")
{
DataW.Text = "Data Width: " +valuebro + " bit";
}
else if (name == "L2Size")
{
l2size = Convert.ToInt32(valuebro) / 1000;
L2Size.Text = "L2 Size: " + l2size.ToString() + " MB";
}
else if (name == "L3Size")
{
l3size = Convert.ToInt32(valuebro) / 1000;
L3Size.Text ="L3 Size: "+ l3size.ToString() + " MB";
}
else if (name == "NOC")
{
NoOfCores.Text = "Cores: " + valuebro;
}
else if (name == "VOLT")
{
voltage = Convert.ToDecimal(valuebro) / 10;
output = voltage.ToString();
CurrentVolt.Text = "Core Voltage: " + output + " V";
}
else if (name == "CPUSTATUS")
{
CPUSTATUS.Text = "Status: " + valuebro;
}
else if (name == "AVAIL")
{
Avail.Text = "Code: " + valuebro;
}
}
}
(内存)
private void raminfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher ram = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject rm in ram.Get())
{
string valueram = Convert.ToString(rm[syntax]);
if (name == "OED")
{
OEDRAM.Text = "" + valueram;
}
else if (name == "ERRINFO")
{
ErrInfoRam.Text = "Error code: " + valueram;
}
else if (name == "ERRDESC")
{
ErrDescRAM.Text = "" + valueram;
}
else if (name == "CCVOLT")
{
volts = Convert.ToDecimal(valueram) / 1000;
finaloutput = volts.ToString();
voltageram.Text = "Voltage: " +finaloutput + " V";
}
else if (name == "CCSPEED")
{
Currentspeed.Text = "Current Frequency: " + valueram + " Mhz";
}
else if (name == "SPEED")
{
speedram.Text = "Max Frequency: " + valueram + " Mhz";
}
else if (name == "CAPA")
{
Int64 capa = Convert.ToInt64(valueram) / 1024;
Int64 final = capa / 1024;
capacityram.Text = "Total memory: " + final + " MB";
}
}
}
(显卡)
private void gpuinfo(string hwclass, string syntax, string name)
{
ManagementObjectSearcher gpu = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM " + hwclass);
foreach (ManagementObject gp in gpu.Get())
{
string valuegpu = Convert.ToString(gp[syntax]);
if (name == "GPUNAME")
{
NameGPU.Text = valuegpu;
}
else if (name == "Availability")
{
AvailGPU.Text = "Status code: " + valuegpu;
}
else if (name == "CONFMEC")
{
CMEC.Text = "Error code: " + valuegpu;
}
else if (name == "DVer")
{
DriverVers.Text = "Driver Version: " + valuegpu;
}
else if (name == "ERDESC")
{
ErrDescr.Text = valuegpu;
}
else if (name == "ERRCLR")
{
ErrorClear.Text = valuegpu;
}
else if (name == "STAT")
{
StatusGPU.Text = "Status: " + valuegpu;
}
}
}
一个简单的更改将 WMI 查询过滤到所请求的字段,使我的查询速度提高了 100 多次:
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", $"SELECT {syntax} FROM " + hwclass);
但是,还是无缘无故的多次查询。可以编写一个更高效的版本,一次查询所有需要的字段,而且速度仍然快 3 倍。此版本包括其他建议的改进:
private void cpuinfos(List<string> dataElements) {
ManagementObjectSearcher mos = new ManagementObjectSearcher("root\CIMV2", $"SELECT {String.Join(",", dataElements)} FROM Win32_Processor");
foreach (ManagementObject cpuInfo in mos.Get()) {
foreach (var anElementName in dataElements) {
string valuebro = Convert.ToString(cpuInfo[anElementName]);
switch (anElementName) {
case "Name":
CPUNAME.Text = valuebro;
break;
case "MaxClockSpeed":
//CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
maxfreqbro = Convert.ToInt32(valuebro);
break;
case "CurrentClockSpeed":
curfreqbro = Convert.ToInt32(valuebro);
CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
break;
case "ThreadCount":
THREADC.Text = "Threads: " + valuebro;
break;
case "DataWidth":
DataW.Text = "Data Width: " + valuebro + " bit";
break;
case "L2CacheSize":
l2size = Convert.ToInt32(valuebro) / 1000;
L2Size.Text = "L2 Size: " + l2size.ToString() + " MB";
break;
case "L3CacheSize":
l3size = Convert.ToInt32(valuebro) / 1000;
L3Size.Text = "L3 Size: " + l3size.ToString() + " MB";
break;
case "NumberOfCores":
NoOfCores.Text = "Cores: " + valuebro;
break;
case "CurrentVoltage":
voltage = Convert.ToDecimal(valuebro) / 10.0m;
output = voltage.ToString();
CurrentVolt.Text = "Core Voltage: " + output + " V";
break;
case "Status":
CPUSTATUS.Text = "Status: " + valuebro;
break;
case "Availability":
Avail.Text = "Code: " + valuebro;
break;
}
}
}
}
您可以通过传递要收集的值来使用它:
cpuinfos(new List<string>() { "Name", "MaxClockSpeed", "ThreadCount" });