如何在C#中进行只进,只读的WMI查询?

时间:2009-06-11 01:11:10

标签: c# .net wmi

一位同事告诉我,如果我的WMI系统信息收集查询只是前向和/或只读,那么它们会更快。那讲得通。但是我该怎么做呢?

2 个答案:

答案 0 :(得分:5)

您需要使用EnumerationOptions类并将其Rewindable属性设置为false。这是一个例子:

using System;
using System.Management;

namespace WmiTest
{
    class Program
    {
        static void Main()
        {
            EnumerationOptions options = new EnumerationOptions();
            options.Rewindable = false;
            options.ReturnImmediately = true;

            string query = "Select * From Win32_Process";

            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(@"root\cimv2", query, options);

            ManagementObjectCollection processes = searcher.Get();

            foreach (ManagementObject process in processes)
            {
                Console.WriteLine(process["Name"]);
            }

            // Uncomment any of these
            // and you will get an exception:

            //Console.WriteLine(processes.Count);

            /*
            foreach (ManagementObject process in processes)
            {
                Console.WriteLine(process["Name"]);
            }
            */
        }
    }
}

除非您使用它来枚举具有大量实例的类(如Cim_DataFile),否则您将看不到任何性能改进,并且您只能枚举返回的ManagementObjectCollection一次。您也将无法使用ManagementObjectCollection.Count等。 至于只读查询,我不知道如何制作这些查询。

答案 1 :(得分:1)

您的同事必须意味着将半同步方法调用与仅向前调查器一起使用。在半同步模式下,WMI方法立即调用返回,并在后台检索对象,并在创建后按需返回。此外,当使用半同步模式检索大量实例时,建议获取仅向前的枚举器以提高性能。这些特性在MSDN article中进行了解释。

正如Uros所指出的那样,要在半同步模式下获得仅向前的枚举器,您需要使用EnumerationOptions类实例,并将ReturnImmediately属性设置为true和{ {1}}属性设置为Rewindable,例如:

false