2012-08-28 10 views
7

Mam kwerendę WMI, używając ManagementObjectSearcher.Usługa WMI ManagementObjectSearcher w zapytaniu

Zwykle działa to dobrze, ale na niektórych maszynach wisi/nigdy nie wraca. Próbowałem ustawić limit czasu na kwerendę, ale wydaje się, że nie robi różnicy.

To jest mój kod:

using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process")) 
{ 
    try 
    { 
     query.Options.Timeout = new TimeSpan(0, 0, 10); 
     query.Options.ReturnImmediately = false; 
     Log.Info("Query built"); 
     foreach (ManagementObject obj in query.Get()) 
     { 
      using (obj) 
      { 
       var key = (uint)obj.GetPropertyValue("IDProcess"); 
       Log.Info(key); 
       processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
      } 
     } 
    } 
} 

W moim dzienniku, widzę „Query zbudowany”, a potem nic, a program przestaje odpowiadać.

Próbowałem już z ręcznym ustawieniem limitu czasu i bez niego.

Odpowiedz

-3

powinno działać bez „używania”

var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"); 
try 
{ 
    query.Options.Timeout = new TimeSpan(0, 0, 10); 
    query.Options.ReturnImmediately = false; 
    log.Info("Query built"); 
    foreach (ManagementObject obj in query.Get()) 
    { 
     using (obj) 
     { 
      var key = (uint)obj.GetPropertyValue("IDProcess"); 
      Log.Info(key); 
      processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
     } 
    } 
} 
3

Ostatnio testowanych przez nas kwerend WMI w „wierszu poleceń C#” i WMI działa zgodnie z oczekiwaniami, ale po przepisywanie w WPF mamy do czynienia ten sam problem jak ty . Po przeprowadzeniu pewnych badań odkryłem, że WMI zwisa, jeśli pracujesz w trybie STA (Single Threading Apartment), ale WPF działa w trybie STA, więc aby wykonać zadanie, używamy ThreadPool (przepisanie do twojego przypadku):

 ThreadPool.QueueUserWorkItem((_) => 
      { 
       using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process")) 
       { 
        try 
        { 
         query.Options.Timeout = new TimeSpan(0, 0, 10); 
         query.Options.ReturnImmediately = false; 
         Log.Info("Query built"); 
         foreach (ManagementObject obj in query.Get()) 
         { 
          using (obj) 
          { 
           var key = (uint)obj.GetPropertyValue("IDProcess"); 
           Log.Info(key); 
           processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
          } 
         } 
        } 
        catch (SystemException) 
        { 
        } 
       } 
      });