2010-12-07 12 views
5

W aplikacji C# .Net MVC2 mamy prostą funkcję, aby uzyskać identyfikator procesora jako część schematu identyfikacji serwera WWW. Odpowiednia część to:ManagementObjectSearcher z pamięci excepiton

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

działa dobrze w dev i na wielu serwerach internetowych z uruchomionymi cassini i IIS. Jednak w najnowszej instalacji na maszynie z systemem Windows Server 2008 Server podczas pierwszego wywołania wyrzucono wyjątek braku pamięci, aby uzyskać identyfikator procesora. Wszelkie porady dotyczące możliwej przyczyny lub lepszego sposobu na osiągnięcie powyższych.

Wiele Dzięki

Edycja zawierać ślad stosu:

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

Pokaż ślad stosu wyjątku. –

Odpowiedz

7

po prostu wpadł na podobny problem, próbując kwerendy Win32_Service. Poszedłem do konsoli WMI pod numerem Administrative Tools\Computer Management. Główny ekran pokazał błąd braku pamięci dla Win32_Process. Skończyło się na ponownym uruchomieniu usługi WMI ("Windows Management Instrumentation") i to naprawiło problem.

+2

Znany błąd w najnowszych wersjach WMI podczas wysyłania zapytań do Win32_Service. Zobacz na przykład http://brooke.blogs.sqlsentry.net/2010/02/win32service-memory-leak.html. Nie jestem pewien, czy dotyczy to innych klas WMI. –

+0

Wpadłem na ten sam problem. Ponownie uruchomiono usługę WMI ("Windows Management Instrumentation") i to rozwiązało problem. Dzięki, – sean717

+0

Wpadłem również na to zapytanie 'Win32_Printer' – Cameron