c# - ManagementObjectSearcher WMIquery 很慢

标签 c# wmi

我有一个重复运行的 .NET 6.0 代码来监控机器上的 CPU 并将统计信息发送到仪表板服务器:

var stopwatch = Stopwatch.StartNew();
var processorQuery = new ManagementObjectSearcher().WMIquery("select * from Win32_Processor");
Log(stopwatch.ElapsedMilliseconds); // !!! 2 to 10 seconds!

// now process the results
var processors = new JArray();
foreach (var processorMO in processorQuery) {
  var name = processorMO["Name"]?.ToString() ?? "";
  var addressWidth = Double.Parse(processorMO["AddressWidth"]?.ToString() ?? "-1");
  if (name.IndexOf(addressWidth.ToString()) != -1) name = $"{name} x{addressWidth}";
  var maxClockSpeedGHz = Double.Parse(processorMO["MaxClockSpeed"]?.ToString() ?? "-1000") / 1000.0;
  if (name.IndexOf(maxClockSpeedGHz.ToString()) != -1) name = $"{name} {maxClockSpeedGHz}GHz";
  var numberOfCores = Double.Parse(processorMO["NumberOfCores"]?.ToString() ?? "-1");
  name = $"{name} {numberOfCores}cores";
  name = name.Replace("CPU ", " ").Replace(" M ", " M").Replace(" @ ", " ");
  name = string.Join(" ", name.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); // replace multiple spaces with single
  int loadPercentage = (int)Double.Parse(processorMO["LoadPercentage"]?.ToString() ?? "-1");
  processors.Add(new JObject() { { "Name", name }, { "LoadPercentage", loadPercentage } });
}
我的问题是对 WMIquery 的调用非常慢..从2.5到10秒!
有什么我做错了吗?有没有办法更快地获取这些信息?

(PS 还有哪些标签在这里有用?)

最佳答案

您可以使用 GetSystemTimes,它为所有内核提供空闲、内核和用户时间。
如果你这样做,例如每秒钟您都可以以更有效的方式自己计算总体 CPU 利用率。

  • https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getsystemtimes


  • C# System CPU Usage and syncing with Windows Task Manager
  • 关于c# - ManagementObjectSearcher WMIquery 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68708589/

    相关文章:

    c# - 支持编译依赖的多个版本 (vNext)

    c# - 如何使用 C# 从网页打开事件查看器?

    java - 使用 JNA 与 CoSetProxyBlanket 的 COAUTHIDENTITY

    c# - 如何在远程计算机上运行 ClickOnce 应用程序 (.appref-ms)?

    c# - 如何将 .NET 库的源代码获取到 VS

    c# - asp .net mvc 中的路由

    C#返回mysql的行数

    c# - 带有面板的自己的组件

    delphi - 如何获取我的磁盘分区的 GUID?

    python - 使用 IronPython 中的 ManagementClass.Getinstances()