2009-06-11 9 views

Répondre

5

Vous devez utiliser la classe EnumerationOptions et définir sa propriété Rewindable sur false. Voici un exemple:

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"]); 
      } 
      */ 
     } 
    } 
} 

Vous ne verrez aucune amélioration de la performance à moins que vous l'utiliser pour énumérer une classe avec un grand nombre de cas (comme CIM_DataFile) et vous obtiendrez d'énumérer le ManagementObjectCollection retourné une seule fois. Vous ne pourrez pas non plus utiliser ManagementObjectCollection.Count, etc. En ce qui concerne les requêtes en lecture seule, je ne suis pas sûr de savoir comment les faire.

1

Votre collègue a dû utiliser les appels de méthodes semi-synchrones avec des enquêteurs uniquement expéditeurs. En mode semi-synchrone, les appels de méthode WMI reviennent immédiatement et les objets sont récupérés en arrière-plan et renvoyés à la demande une fois créés. De même, lorsque vous utilisez le mode semi-synchrone pour extraire un grand nombre d'instances, il est recommandé d'obtenir des énumérateurs uniquement pour l'amélioration des performances. Ces particularités sont expliquées dans cette section MSDN article.

Comme Uros a souligné, pour obtenir un avant uniquement recenseur en mode semi-synchrone, vous devez utiliser l'instance de classe EnumerationOptions avec la propriété ReturnImmediately mis à true et la propriété Rewindable mis à false, par exemple:

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

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, opt); 
Questions connexes