2

サービスのコンストラクターで 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 を正しい方法で使用していますか?? ガイドしてください。

4

2 に答える 2

2

あなたの別の質問への答えは、クラスのオブジェクトパスを構築し、ManagementObject を直接使用してパフォーマンスを向上させることができることを示唆しているため、ManagementObject がインスタンスを返すかどうかを確認したい場合は、プライベートプロパティを使用できますIsBound

string ServicePath = string.Format("Win32_Service.Name=\"{0}\"", "MyService");
var WMiObject = new ManagementObject(ServicePath);
PropertyInfo PInfo = typeof(ManagementObject).GetProperty("IsBound", BindingFlags.NonPublic | BindingFlags.Instance);
if ((bool)PInfo.GetValue(WMiObject, null))
{
    string PathName = (string)WMiObject.GetPropertyValue("PathName");
    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...");
}
于 2012-05-09T17:52:19.717 に答える