8

Когда я открыл свой ноутбук этим утром, он перезагрузился сам (после установки обновлений). Теперь .NET Runtime Optimization Service (ngen?) использует довольно много ресурсов процессора, пока компьютер работает от батареи. Мне интересно, есть ли способ попросить Windows отложить эти задачи, пока ноутбук не подключен? Я включил ноутбук на ночь, но 30% батареи разряжены менее чем через час использования, что не является обычной ситуацией.

Мой компьютер не простаивал, когда он делал это, поэтому я предполагаю, что он собирает высокоприоритетные сборки после обновления .Net Framework из этой статьи.

Я проверил историю обновлений Windows, и она установила накопительное обновление за ночь, пока он подключен. (Https://support.microsoft.com/en-ie/help/4038788/windows-10-update-kb4038788). Я бы хотел, чтобы Windows запускала оптимизацию .net как часть этого процесса, вместо того, чтобы ждать, пока я начну использовать ноутбук от батареи.

Диспетчер задач

1 ответ1

1

Короткий ответ - нет, вы не можете надежно отложить ngen (и вы не должны пытаться), единственная найденная / полезная опция, которую я нашел, состояла в том, чтобы заставить его работать до конца и не оставлять его скрытым в фоновом режиме.

Если вы пытаетесь сэкономить некоторые циклы ЦП на батарее (или в моем случае не позволить серверу запустить ngen после возврата его в эксплуатацию после обновлений Windows), лучше всего заставить ngen работать самостоятельно. Для настольного ПК на ум приходят 2 варианта:

  1. Создайте файл .bat или .ps1 на рабочем столе с помощью соответствующей команды ngen ниже - просто дважды щелкните и дождитесь закрытия ngen, прежде чем отключить его. Если вместо этого вы создадите сценарий в папке Windows и добавите к нему ярлык на рабочем столе, вы также можете использовать командную строку или подсказку Powershell или диалоговое окно «Выполнить», чтобы выполнить его по мере необходимости (перед отключением / после обновления).

  2. Другой вариант, который должен работать, - использовать запланированное задание для выполнения вышеуказанного сценария. Запустите его при запуске, не входя в систему как администратор. Если на вашем ноутбуке разрешено устанавливать обновления в течение ночи и он может перезагрузиться, это должно работать хорошо.

Чтобы запустить ngen, вам нужна только одна из следующих команд, используйте первый / наиболее подходящий вариант для вашей системы:

  • .Net 4 или лучше на 64-битной C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems

  • .Net 4 или лучше на 32-битной C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems

  • .Net 3 или менее на 64-битной C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe executeQueuedItems

  • .Net 3 или менее на 32- C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe executeQueuedItems

Ниже приведен минимальный результат, который вы получаете от ngen, когда нет элементов в очереди:

PS C:\Users\Administrator> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
Microsoft (R) CLR Native Image Generator - Version 4.6.1586.0
Copyright (c) Microsoft Corporation.  All rights reserved.
All compilation targets are up to date.

Когда ngen.exe запускается с executeQueuedItems он заставляет его выполнять все отложенные задачи как можно быстрее. Обычно ngen работает в фоновом потоке с низким приоритетом (и, по-видимому, просто запускается случайным образом), идея заключается в том, что он не должен останавливать другие процессы ЦП - хотя это не всегда работает. Интерактивный запуск ngen выполняется быстрее, чем запуск в фоновом режиме, но это больше влияет на производительность. Сколько времени это займет, зависит от вашего оборудования и от того, сколько / какие нативные образы нужно перекомпилировать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .