加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WMI ManagementObjectSearcher挂起查询

发布时间:2020-12-15 07:50:21 所属栏目:百科 来源:网络整理
导读:我有一个使用ManagementObjectSearcher的WMI查询. 通常,这样可以正常工作,但在某些机器上,它会挂起/永不返回.我已经尝试在查询上设置超时,但似乎没有任何区别. 这是我的代码: using (var query = new ManagementObjectSearcher("SELECT IDProcess,PercentPr
我有一个使用ManagementObjectSearcher的WMI查询.

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

这是我的代码:

using (var query = new ManagementObjectSearcher("SELECT IDProcess,PercentProcessorTime,WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
{
   try
   {
        query.Options.Timeout = new TimeSpan(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#命令行”测试了WMI查询,WMI按预期工作,但在WPF重写后,我们遇到了和你一样的问题.经过一些研究,我发现如果你在STA(单线程公寓模式)中运行WMI,而WPF在STA模式下运行,那么为了执行任务,我们使用ThreadPool(重写你的情况):
ThreadPool.QueueUserWorkItem((_) =>
            {
                using (var query = new ManagementObjectSearcher("SELECT IDProcess,WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"))
                {
                    try
                    {
                        query.Options.Timeout = new TimeSpan(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)
                    {
                    }
                }
            });

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读