Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WMI调用性能_C#_Wmi - Fatal编程技术网

C# WMI调用性能

C# WMI调用性能,c#,wmi,C#,Wmi,我需要在我的服务的构造函数中进行WMI调用。但是,当我启动/重新启动系统时,此调用会花费大量时间 我正在使用以下代码获取windows服务的路径。。。。 这里我使用了枚举选项来提高查询性能,现在为了使用它,我必须使用ManagementScope,即root\civm2,每次我都要使用root'civm2作为管理范围 之前我使用的是managementObjectCollection.Count以了解它是否包含任何项,现在为了提高性能,我使用的是managementObjectEnumerato

我需要在我的服务的构造函数中进行WMI调用。但是,当我启动/重新启动系统时,此调用会花费大量时间

我正在使用以下代码获取windows服务的路径。。。。 这里我使用了枚举选项来提高查询性能,现在为了使用它,我必须使用ManagementScope,即root\civm2,每次我都要使用root'civm2作为管理范围

之前我使用的是managementObjectCollection.Count以了解它是否包含任何项,现在为了提高性能,我使用的是managementObjectEnumerator.MoveNext,它是否有帮助,我已经对与计数相关的代码进行了注释

有没有更好的方法来提高相同代码的性能

EnumerationOptions=新的EnumerationOptions; //options.Rewindable=false;**/为了得到结果,我不得不对此进行评论** options.returninstally=true; string query=string.format从Win32_服务中选择路径名,其中Name='{0}',MyService; ManagementScope ms12=新建ManagementScope@root\cimv2; ms12.连接; 使用var managementObjectSearcher=new ManagementObjectSearcherquery { managementObjectSearcher.Scope=ms12; managementObjectSearcher.Options=选项; var managementObjectCollection=managementObjectSearcher.Get; //如果managementObjectCollection.Count>0 //{ var managementObjectEnumerator=managementObjectCollection.GetEnumerator; 如果managementObjectEnumerator.MoveNext { var invalidChars=new Regexstring.FormatCultureInfo.InvariantCulture,[{0}],Regex.escapeNewStringPath.GetInvalidPathChars; var path=invalidChars.ReplacemanagementObjectEnumerator.Current.GetPropertyValuePathName.ToString,string.Empty; Console.WriteLinepath; } //} 其他的 { Console.WriteLinelse部分。。。; } } 我是否以正确的方式使用范围和枚举选项??
请指导。

作为对您的另一个建议的回答,您可以构建类的对象路径并直接使用ManagementObject来提高性能,现在如果您想检查ManagementObject是否返回实例,您可以使用私有属性IsBound


在较新版本的.NET framework中,绑定的发生时间似乎越晚越好。至少在我测试特定共享文件夹的存在性时是这样

这里是对@RRUZ解决方案的更新,它使用try-catch而不是反映IsBound内部属性

var servicePath = string.Format("Win32_Service.Name=\"{0}\"", "MyService");
string pathName = null;
try
{
    var wmiObject = new ManagementObject(servicePath);
    pathName = (string)wmiObject.GetPropertyValue("PathName");
}
catch {}

if (pathName != null)
{
    var invalidChars = new Regex(string.Format(CultureInfo.InvariantCulture, "[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))));
    var path = invalidChars.Replace(pathName, string.Empty);
    Console.WriteLine(path);
}
else
{
    Console.WriteLine("Else part...");
}
var servicePath = string.Format("Win32_Service.Name=\"{0}\"", "MyService");
string pathName = null;
try
{
    var wmiObject = new ManagementObject(servicePath);
    pathName = (string)wmiObject.GetPropertyValue("PathName");
}
catch {}

if (pathName != null)
{
    var invalidChars = new Regex(string.Format(CultureInfo.InvariantCulture, "[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))));
    var path = invalidChars.Replace(pathName, string.Empty);
    Console.WriteLine(path);
}
else
{
    Console.WriteLine("Else part...");
}