c# – WMI ManagementObjectSearcher挂起查询

前端之家收集整理的这篇文章主要介绍了c# – WMI ManagementObjectSearcher挂起查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用ManagementObjectSearcher的WMI查询.

通常,这样可以正常工作,但在某些机器上,它会挂起/永不返回.我已经尝试在查询上设置超时,但似乎没有任何区别.

这是我的代码

  1. using (var query = new ManagementObjectSearcher("SELECT IDProcess,PercentProcessorTime,WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
  2. {
  3. try
  4. {
  5. query.Options.Timeout = new TimeSpan(0,10);
  6. query.Options.ReturnImmediately = false;
  7. Log.Info("Query built");
  8. foreach (ManagementObject obj in query.Get())
  9. {
  10. using (obj)
  11. {
  12. var key = (uint)obj.GetPropertyValue("IDProcess");
  13. Log.Info(key);
  14. processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"),(ulong)obj.GetPropertyValue("WorkingSet") };
  15. }
  16. }
  17. }
  18. }

在我的日志中,我看到“查询已构建”,然后什么都没有,程序变得没有响应.

我尝试过使用和不使用手动超时设置.

解决方法

最近我们在“C#命令行”测试了WMI查询,WMI按预期工作,但在WPF重写后,我们遇到了和你一样的问题.经过一些研究,我发现如果你在STA(单线程公寓模式)中运行WMI,而WPF在STA模式下运行,那么为了执行任务,我们使用ThreadPool(重写你的情况):
  1. ThreadPool.QueueUserWorkItem((_) =>
  2. {
  3. using (var query = new ManagementObjectSearcher("SELECT IDProcess,WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
  4. {
  5. try
  6. {
  7. query.Options.Timeout = new TimeSpan(0,10);
  8. query.Options.ReturnImmediately = false;
  9. Log.Info("Query built");
  10. foreach (ManagementObject obj in query.Get())
  11. {
  12. using (obj)
  13. {
  14. var key = (uint)obj.GetPropertyValue("IDProcess");
  15. Log.Info(key);
  16. processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"),(ulong)obj.GetPropertyValue("WorkingSet") };
  17. }
  18. }
  19. }
  20. catch (SystemException)
  21. {
  22. }
  23. }
  24. });

猜你在找的C#相关文章