gpt4 book ai didi

c# - WMI ManagementObjectSearcher 在查询时挂起

转载 作者:太空狗 更新时间:2023-10-29 20:42:06 25 4
gpt4 key购买 nike

我有一个 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") };
}
}
}
}

在我的日志中,我看到“Query built”,然后什么也没有,程序变得没有响应。

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

最佳答案

最近我们在“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)
{
}
}
});

关于c# - WMI ManagementObjectSearcher 在查询时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12162797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com