Cuando abrí mi computadora portátil esta mañana, se había reiniciado sola (después de instalar las actualizaciones). Ahora, el .NET Runtime Optimization Service (ngen?) Está utilizando bastante CPU mientras la computadora funciona con batería. Me pregunto, ¿hay alguna forma de pedirle a Windows que difiera estas tareas hasta que la computadora portátil esté enchufada? Tenía la computadora portátil conectada durante la noche, pero el 30% de mi batería se ha agotado después de menos de una hora de uso, lo cual no es la situación habitual.
Mi computadora no estaba inactiva mientras hacía esto, así que supongo que está compilando ensamblados de alta prioridad después de una actualización de .Net Framework de este artículo .
Revisé el historial de actualizaciones de Windows y había instalado una actualización acumulativa durante la noche mientras estaba enchufado. ( Https://support.microsoft.com/en-ie/help/4038788/windows-10-update-kb4038788 ). Deseo que Windows ejecute la optimización .net como parte de ese proceso en lugar de esperar a que comience a usar la computadora portátil con batería.
Respuestas:
La respuesta corta es no, no puede diferir confiablemente ngen (y no debe intentarlo), la única opción consistente / útil que encontré fue forzarlo a ejecutarse hasta su finalización y no dejarlo al acecho en el fondo.
Si está intentando guardar algunos ciclos de CPU en la batería (o en mi caso impide que un servidor ejecute ngen después de devolverlo al servicio después de las actualizaciones de Windows), su mejor opción es forzar que ngen se ejecute usted mismo. Para una PC de escritorio, se me ocurren 2 opciones:
Cree un archivo .bat o .ps1 en su escritorio con el comando ngen apropiado a continuación: simplemente haga doble clic y espere a que ngen se cierre antes de desenchufarlo. Si crea el script en su carpeta de Windows en su lugar y abre un acceso directo a él en su escritorio, también puede usar Command o Powershell Prompt o el cuadro de diálogo Ejecutar para ejecutarlo según sea necesario (antes de desconectar / después de una actualización).
Otra opción que debería funcionar es utilizar una tarea programada para ejecutar el script anterior. Ejecútelo al inicio, sin un usuario conectado, como administrador. Si su computadora portátil puede instalar actualizaciones durante la noche y puede reiniciarse, esto debería funcionar bien.
Para ejecutar ngen solo necesita uno de los siguientes comandos, use la primera / más apropiada opción para su sistema:
.Net 4 o mejor en 64 bits
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
.Net 4 o mejor en 32 bits
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
.Net 3 o menos en 64 bits
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe executeQueuedItems
.Net 3 o menos en 32 bits
C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe executeQueuedItems
A continuación se muestra el resultado mínimo que obtiene de ngen cuando no hay elementos en cola:
Cuando se ejecuta ngen.exe
executeQueuedItems
, lo obligará a realizar todas las tareas pendientes lo más rápido posible. Normalmente, ngen se ejecuta en un subproceso de fondo de baja prioridad (y aparentemente solo comienza al azar), la idea es que no debería privar a otros procesos de la CPU, aunque eso no siempre funciona. Ejecutar ngen de forma interactiva es más rápido que dejarlo ejecutándose en segundo plano, pero afectará más el rendimiento. El tiempo que tarde dependerá de su hardware y cuántas / qué imágenes nativas necesitan recompilarse.fuente