2010-12-07 12 views
5

En una aplicación C# .Net MVC2 tenemos una función simple para obtener la id del procesador como parte de un esquema para identificar el servidor web. La parte relevante es:ManagementObjectSearcher sin memoria exceptiton

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select ProcessorId from Win32_Processor")) 
     { 
      foreach (ManagementObject share in searcher.Get()) 
      { 
       foreach (PropertyData PC in share.Properties) 
       { 
        return PC.Value.ToString(); 
       } 
      } 
     } 

ha funcionado bien en dev y en una serie de servidores web que ejecutan cassini e IIS. Sin embargo, en la última instalación en una máquina de Server 2008 se lanza una Excepción de falta de memoria en la primera llamada para obtener la id del procesador. Cualquier consejo sobre una posible causa o mejor forma de lograr lo anterior.

Muchas Gracias

Editar para incluir el seguimiento de pila:

System.Management.ManagementException: Out of memory 


at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 
    at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext() 
    at GIB.Helpers.SoftwarehouseLicenseAttribute.GetProcessorID() in C:\Users\Dog\Documents\Visual Studio 2010\Projects\GIB\GIB\Helpers\SoftwarehouseLicense.cs:line 177 
    at GIB.Helpers.SoftwarehouseLicenseAttribute.setup() in C:\Users\Dog\Documents\Visual Studio 2010\Projects\GIB\GIB\Helpers\SoftwarehouseLicense.cs:line 75 
    at GIB.Controllers.HomeController.Setup() in C:\Users\Dog\Documents\Visual Studio 2010\Projects\GIB\GIB\Controllers\HomeController.cs:line 37 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
    at System.Web.Mvc.Controller.ExecuteCore() 
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 
    at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
+1

Muestra el seguimiento de la pila de la excepción. –

Respuesta

7

Me acabo de encontrar con un problema similar, intentar consultar Win32_Service. Fui a la consola WMI bajo Administrative Tools\Computer Management. La pantalla principal mostró un error de falta de memoria para Win32_Process. Terminé reiniciando el servicio WMI ("Windows Management Instrumentation") y eso solucionó el problema.

+2

Hay un error conocido en las versiones recientes de WMI al consultar Win32_Service. Ver, por ejemplo, http://brooke.blogs.sqlsentry.net/2010/02/win32service-memory-leak.html. No estoy seguro de que se aplique a otras clases de WMI. –

+0

Me encontré con el mismo problema. Reinició el servicio WMI ("Instrumentación de administración de Windows") y eso solucionó el problema. Gracias, – sean717

+0

También encontré esta pregunta 'Win32_Printer' – Cameron

Cuestiones relacionadas