0

私の環境では、いくつかのサーバーから複数の情報を取得したいと考えています。

このコードは機能していますが、このコードは情報を取得する良い方法ですか?

リクエストごとに「new ManagementObjectSearcher」を呼び出してもよろしいですか?

ManagementObjectSearcher cpuUsage = new ManagementObjectSearcher
      ("\\\\" + strComputer + "\\root\\CIMV2", 
      "SELECT * FROM Win32_Processor");

foreach (ManagementObject queryObj in cpuUsage.Get())
{
    Console.WriteLine("LoadPercentage: {0}", queryObj["LoadPercentage"]);
}

ManagementObjectSearcher totalRAM = new ManagementObjectSearcher
       ("\\\\" + strComputer + "\\root\\CIMV2", 
       "SELECT * FROM Win32_ComputerSystem");

foreach (ManagementObject queryObj in totalRAM.Get())
{
  Console.WriteLine("TotalPhysicalMemory: {0}", queryObj["TotalPhysicalMemory"]);
}

ManagementObjectSearcher freeRAM = new ManagementObjectSearcher
  ("\\\\" + strComputer + "\\root\\CIMV2", 
      "SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory");

foreach (ManagementObject queryObj in freeRAM.Get())
{
    Console.WriteLine("AvailableMBytes: {0}", queryObj["AvailableMBytes"]);
}
4

2 に答える 2

1

ManagementObjectSearcher毎回サーバーに接続するため、 を再利用する必要があります。これはオーバーヘッドになります。

もう少し効率を上げるためにSELECT * FROM、wql で使用する代わりに、必要なプロパティを指定できます。

SELECT LoadPercentage FROM Win32_ComputerSystem
于 2012-03-02T11:57:13.763 に答える
1

私は似たようなことをしました。アプリケーションの実行時間が長いため、ManagementScopeマシンごとに 1 つ、マシンManagementObjectSearcherごとのクエリごとに 1 つ保持しています。クエリ中にエラーが発生した場合にのみ、これらのオブジェクトを破棄します。

于 2012-03-02T11:57:49.250 に答える