2009-06-11 3 views
4

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

ответ

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

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

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

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

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, opt); 
Смежные вопросы