Как сделать прямые и только для чтения WMI-запросы в C #? - PullRequest
4 голосов
/ 11 июня 2009

Мне сказали коллеги, что, если мои запросы сбора информации о системе WMI предназначены только для пересылки и / или только для чтения, они будут работать намного быстрее. В этом есть смысл. Но как мне это сделать?

Ответы [ 2 ]

5 голосов
/ 13 июня 2009

Вам необходимо использовать класс 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 голос
/ 13 июня 2009

Ваш коллега должен был использовать полусинхронные вызовы метода вместе с перечислителями только для пересылки. В полусинхронном режиме вызовы методов WMI немедленно возвращаются, а объекты извлекаются в фоновом режиме и возвращаются по требованию после их создания. Кроме того, при использовании полусинхронного режима для извлечения большого количества экземпляров рекомендуется получить перечислители только для пересылки, чтобы повысить производительность. Эти особенности объяснены в этой статье MSDN .

Как указал Урос, чтобы получить перечислитель только для пересылки в полусинхронном режиме, вам нужно использовать экземпляр класса EnumerationOptions с свойством ReturnImmediately, установленным на true, и свойством Rewindable, установленным на false, например:

EnumerationOptions opt = new EnumerationOptions();
opt.ReturnImmediately = true;
opt.Rewindable = false;

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, opt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...