2012-08-28 11 views
7

Tengo una consulta de WMI, utilizando ManagementObjectSearcher.WMI ManagementObjectSearcher colgando de consulta

Por lo general, esto funciona bien, pero en algunas máquinas, que está colgando/no volver nunca. Intenté configurar un tiempo de espera en la consulta, pero parece no hacer diferencia.

Este es mi código:

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

En mi registro, veo "construcción de búsqueda", y luego nada y el programa deja de responder.

que he probado con y sin el ajuste de tiempo de espera manual.

Respuesta

-3

que debería funcionar sin el 'usando'

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

consultas WMI Recientemente hemos probado en "C línea de comandos #" y WMI funcionó como se esperaba, pero después de volver a escribir en WPF nos enfrentamos al mismo problema que tú . Después de algunas investigaciones, encontré que WMI colgaba si operaba en STA (modo Single Threading Apartment) pero WPF operaba en modo STA, por lo que para realizar la tarea estamos usando ThreadPool (reescribiendo a su caso):

 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) 
        { 
        } 
       } 
      }); 
Cuestiones relacionadas