【问题标题】:WMI ManagementObjectSearcher hanging on queryWMI ManagementObjectSearcher 挂起查询
【发布时间】:2012-08-28 15:40:11
【问题描述】:

我有一个 WMI 查询,使用 ManagementObjectSearcher。

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

这是我的代码:

using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
{
   try
   {
        query.Options.Timeout = new TimeSpan(0, 0, 10);
        query.Options.ReturnImmediately = false;
        Log.Info("Query built");
        foreach (ManagementObject obj in query.Get())
        {
            using (obj)
            {
                var key = (uint)obj.GetPropertyValue("IDProcess");
                Log.Info(key);
                processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
            }
        }
    }
}

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

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

【问题讨论】:

    标签: c# .net wmi


    【解决方案1】:

    最近我们在“C# 命令行”测试了 WMI 查询,WMI 按预期工作,但在 WPF 中重写后,我们遇到了和你一样的问题。经过一些研究,我发现如果您在 STA(单线程单元模式)下运行,但 WPF 在 STA 模式下运行,WMI 会挂起,因此要执行我们使用 ThreadPool 的任务(重写您的案例):

            ThreadPool.QueueUserWorkItem((_) =>
                {
                    using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
                    {
                        try
                        {
                            query.Options.Timeout = new TimeSpan(0, 0, 10);
                            query.Options.ReturnImmediately = false;
                            Log.Info("Query built");
                            foreach (ManagementObject obj in query.Get())
                            {
                                using (obj)
                                {
                                    var key = (uint)obj.GetPropertyValue("IDProcess");
                                    Log.Info(key);
                                    processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
                                }
                            }
                        }
                        catch (SystemException)
                        {
                        }
                    }
                });
    

    【讨论】:

      【解决方案2】:

      它应该可以在没有“使用”的情况下工作

      var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet  FROM Win32_PerfFormattedData_PerfProc_Process");
      try
      {
          query.Options.Timeout = new TimeSpan(0, 0, 10);
          query.Options.ReturnImmediately = false;
          log.Info("Query built");
          foreach (ManagementObject obj in query.Get())
          {
              using (obj)
              {
                  var key = (uint)obj.GetPropertyValue("IDProcess");
                  Log.Info(key);
                  processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") };
              }
          }
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多