2009-06-11 19 views

答えて

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

あなたの同僚は、semisynchronousメソッド呼び出しを順方向専用の列挙子とともに使用することを意味する必要があります。半同期モードでは、WMIメソッド呼び出しがすぐに戻り、オブジェクトがバックグラウンドで取得され、オブジェクトが作成されるとオンデマンドで返されます。また、半同期モードを使用して多数のインスタンスを取得する場合は、パフォーマンスを向上させるために前方専用列挙子を取得することをお勧めします。これらの特質は、MSDN articleに説明されています。

ウロスは半同期モードでは、前方のみの列挙子を取得するには、指摘したように、あなたはtrueReturnImmediatelyプロパティセットとfalseに設定RewindableプロパティでEnumerationOptionsクラスのインスタンスを使用する必要があり、例えば:

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

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, opt); 
関連する問題