サービスのコンストラクターで WMI 呼び出しを行う必要があります。しかし、システムを起動/再起動すると、この呼び出しにかなりの時間がかかります。
次のコードを使用して、Windows サービスのパスを取得しています....ここでは、クエリEnumerationOptions
のパフォーマンスを向上させるために を使用しました。 「root'civm2」を管理スコープとして使用する必要があるとき、ManagementScope
以前はmanagementObjectCollection.Count
アイテムが含まれているかどうかを知るために使用していましたが、現在使用しているパフォーマンスを改善するために使用しmanagementObjectEnumerator.MoveNext
ています。カウント関連のコードにコメントしました。
同じコードのパフォーマンスを向上させるより良い方法はありますか...
EnumerationOptions options = new EnumerationOptions();
// options.Rewindable = false; **// I HAVE TO COMMENT OUT THIS IN ORDER TO GET THE RESULTS....**
options.ReturnImmediately = true;
string query = string.Format("SELECT PathName FROM Win32_Service WHERE Name = '{0}'", "MyService");
ManagementScope ms12 = new ManagementScope(@"root\cimv2");
ms12.Connect();
using (var managementObjectSearcher = new ManagementObjectSearcher(query))
{
managementObjectSearcher.Scope = ms12;
managementObjectSearcher.Options = options;
var managementObjectCollection = managementObjectSearcher.Get();
//if (managementObjectCollection.Count > 0)
//{
var managementObjectEnumerator = managementObjectCollection.GetEnumerator();
if (managementObjectEnumerator.MoveNext())
{
var invalidChars = new Regex(string.Format(CultureInfo.InvariantCulture, "[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))));
var path = invalidChars.Replace(managementObjectEnumerator.Current.GetPropertyValue("PathName").ToString(), string.Empty);
Console.WriteLine(path);
}
//}
else
{
Console.WriteLine("Else part...");
}
}
スコープと EnumerationOption を正しい方法で使用していますか?? ガイドしてください。