系统启动/重新启动时,WMI调用会花费太多时间

Lea*_*ner 2 .net c# performance wmi windows-services

我想获得Windows服务的路径,

var managementObjectSearcher = new ManagementObjectSearcher("Select * from Win32_Service where serviceName = MyService");
Run Code Online (Sandbox Code Playgroud)

这段代码是由其他一些服务的构造函数编写的......

当系统启动并运行时,一切正常,但是如果我重新启动系统,则为此调用设置StopWatch类,并显示它显示该服务因此调用而需要35-45秒才能启动.

任何提高系统重启性能的建议......

RRU*_*RUZ 7

Windows32_Services类不存在,因此假设您正在使用Win32_ServiceWMI类,您可以提高性能,只返回您要使用的属性,在本例中为PathName,所以将您的WQL句子更改为

SELECT PathName FROM Win32_Service Where Name='MyService'
Run Code Online (Sandbox Code Playgroud)

UPDATE

@Bacon的观察是非常正确的,因为您知道要检索的服务的名称,您可以构建Win32_Service的对象路径,它看起来像

Win32_Service.Name="ServiceName"
Run Code Online (Sandbox Code Playgroud)

然后使用ManagementObject该类,您可以以最快的方式将实例检索到服务.

  • 由于你是通过`Name`过滤的,它是[Win32_Service类]的关键属性(http://msdn.microsoft.com/en-us/library/windows/desktop/aa394418.aspx),它会更快直接访问实例而不进行搜索:`string path ="Win32_Service.Name = \"MyService \""; ManagementObject service = new ManagementObject(path); string pathName =(string)service.GetPropertyValue("PathName");`但我认为作者说WMI初始化需要很长时间,而不是查询执行时间太长. (2认同)