调用wmi时如何解决缓慢的加载时间(仅处理器)

佩斯

我的C#应用​​程序遇到问题。

我正在使用WMI检索有关我的CPU,GPU和RAM的一些信息。
除了CPU(Win32_Processor以外,其他所有工具都运作良好且速度很快
我有一个菜单,每个菜单都有不同的面板(CPU,RAM,GPU)。
最初,我尝试从应用程序的开始加载所有信息,但效果并不理想,加载时间非常长。
其次,我尝试在面板可见时(单击按钮后)加载它们,并且在ram和gpu面板上效果很好。
我对所有代码都使用了完全相同的代码。就是这样:
如果可能的话,我试图使CPU信息的加载速度与其他信息一样快,但是通过搜索和尝试自己的事情,我无法实现它。
我确实意识到,获取所有信息需要一些时间,似乎很奇怪,它需要那么多时间!
PS:单击cpu面板的按钮时的加载时间为3.5秒,而单击“规格”按钮时的加载时间仅显示maxfreq,内核数,数据宽度,线程数,当前电压以及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";
        }
    }
}

(GPU)

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" });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解决处理器架构之间的不匹配?

调用operator <<时链接器错误,如何解决?

如何逐步加载协处理器

如何在没有函数调用的情况下在 Linux 中检索处理器时间?

如何解决Visual Studio编译错误“处理器体系结构之间的不匹配”?

Gradle中的注释处理器输出源文件以进行构建/分类,从而使javadoc失败。如何解决?

WMI事件处理器的使用与WMI查询

如何在库加载时将预处理器定义传递给 DLL

当仅影响静态方法时,如何解决 C++ 中的链接器错误?

客户端重新加载页面时如何解决服务器故障?

加载数据库页面(Flask / Heroku)时如何解决内部服务器错误?

微码如何加载到处理器?

如何延长处理器的统计时间窗口?

如何解决关机缓慢的问题?

如何解决Dolphin启动缓慢的问题?

如何为不同的记录调用适当的项目处理器?

如何从Gradle插件调用注释处理器

加载gdata包时如何解决Perl警告消息?

如何解决加载文件时的编码错误?

我如何解决“处理时遇到错误:mmodemanager whoopsie

如何在处理器运行时将处理器加载到Apache NiFi中?

如何从处理器内部的Apache Camel中的路由获取响应并在处理器内部调用该路由?

显示加载处理器的异常行为

从服务器请求时间时,出现分段错误(核心已转储)。我该如何解决这个问题?

在php中长时间运行的网络调用会占用处理器核心吗?

我如何解决AWS错误:“仅请求时间与当前时间之间的差异太大”?

JMeter预处理器多次调用

以编程方式调用注释处理器

XSLT处理器调用Java方法