我有一个使用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) { } } });
原文地址:https://www.jb51.cc/csharp/99652.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。