获取ManagementObject属性的最快方法

我有一个方法返回远程机器上的服务列表。 我得到ManagementObjectCollection使用ManagementObjectSearcher.Get()和WIN32查询。 然后在foreach循环中创建我的Service类的实例并将其添加到结果List中。 在初始化新服务时,我使用GetPropertyValue(字符串)获取ManagementObject属性。 我面临的问题是这个过程非常缓慢。 我认为GetPropertyValue很慢(我每次循环使用它7次)。 有更快的方法从ManagementObject类获取属性吗?

 var query = new ObjectQuery("Select Name, DisplayName, ProcessId, Description, State, StartMode, StartName From Win32_Service");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection allServices = searcher.Get();
                foreach (ManagementObject p in allServices)
                {Service newService = new Service{ Name = p.GetPropertyValue("Name"),etc...} result.Add(newService);}

我一直在与此搏斗,试图理解什么是如此缓慢。

我写了一个测试程序,并使用秒表几乎所有的时间。 我有一个从Win32_PnPSignedDriver返回3个设备的wql查询。 我使用三种不同的方法从查询中检索结果。

ManagementObjectCollection queryResults;
ManagementObjectSearcher searcher = new ManagementObjectSearcher();
var myWql = "SELECT * FROM Win32_PnPSignedDriver WHERE ..."
searcher.Scope = new ManagementScope(@"rootCIMV2");
searcher.Query = new WqlObjectQuery(wmiQry);
queryResults = searcher.Get(); 

searcher.Get()很快。

我使用三种从ManagementObjectCollection queryResults中检索数据的方法。

  • (在queryResults中的ManagementBaseObject设备){}
  • IEnumerator enumerator = queryResults.GetEnumerator(); while(enumerator.MoveNext()){}
  • queryResults.CopyTo(deviceArray,0); foreach(var btDevice in deviceArray)
  • 第一次测试:方法1:非常慢 - 超过3000来执行一个空循环。 方法2:速度非常快。 1毫秒方法3:也非常快。 0毫秒。

    然后我在测试中看到了错误。 第一个循环计算了集合中的对象,然后框架记住了这一点。 如果我多次执行方法1,只有初始循环很慢,但重复该foreach的时间为0到1毫秒。

    我重构了测试,在每次获取数据之前重新执行查询。 方法1:每次都很慢。 方法2:每次都很慢。 方法3:我的秒表计时报告0到1毫秒,但我注意到执行时间要长得多。 ???

    深入了解我所编写的内容,我发现我没有按以下时间排列:

    ManagementObject[] deviceArray = new ManagementObject[queryResults.Count];
    

    其实是两个命令:

    var count = queryResults.Count;
    ManagementObject[] deviceArray = new ManagementObject[count];
    

    我分别计时,发现queryResults.Count几乎总是花费时间。 通常> 3000毫秒。

    然后我硬编码数组的大小以避免调用:queryResults.Count

    但是,当我执行

    queryResults.CopyTo(deviceArray, 0);  
    

    CopyTo方法仍然需要知道ManagementObjectCollection中有多少项目,并且现在CopyTo需要> 3000毫秒,其中之前为0或1毫秒。

    所以,它会出现ManagementObjectCollection。 get_Count是瓶颈,并且我不知道如何在不导致Count getter执行的情况下检索结果。

    链接地址: http://www.djcxy.com/p/19201.html

    上一篇: Fastest way of getting properties of ManagementObject

    下一篇: ManagementObjectSearcher on WMI array property