今天早上我打开笔记本电脑时,它已经自行重启(安装更新后)。现在,.NET 运行时优化服务 (ngen?) 在计算机使用电池供电时占用了相当多的 CPU。我想知道,有没有办法让 Windows 推迟这些任务,直到笔记本电脑插上电源?我让笔记本电脑插上电源一整夜,但使用不到一小时,电池就没了 30%,这种情况并不常见。
我的电脑在执行此操作时并没有空闲,因此我假设它在 .Net Framework 更新后编译了高优先级程序集来自这篇文章。
我检查了 Windows 更新历史记录,它在插入电源后一夜之间安装了累积更新。(https://support.microsoft.com/en-ie/help/4038788/windows-10-update-kb4038788)。我希望 Windows 能够将 .net 优化作为该过程的一部分运行,而不是等待我开始使用电池供电的笔记本电脑。
答案1
简短的回答是否定的,您无法可靠地推迟 ngen(并且您不应该尝试),我发现的唯一一致/有用的选项是强制它运行至完成而不是让它潜伏在后台。
如果您尝试节省电池上的一些 CPU 周期(或者在我的情况下,在 Windows 更新后将服务器恢复服务后停止运行 ngen),最好的选择是强制 ngen 自行运行。对于台式电脑,有两个选择:
使用下面适当的 ngen 命令在桌面上创建一个 .bat 或 .ps1 文件 - 只需双击并等待 ngen 关闭即可拔下电源。如果您在 Windows 文件夹中创建脚本并在桌面上创建快捷方式,您也可以使用命令或 Powershell 提示符或运行对话框根据需要执行它(拔下电源之前/更新之后)。
另一个可行的选择是使用计划任务来执行上述脚本。在启动时以管理员身份运行它,无需登录用户。如果您的笔记本电脑被允许在夜间安装更新并且可以重新启动,那么这应该可以很好地工作。
要运行 ngen,您只需要以下命令之一,使用适合您的系统的第一个/最合适的选项:
64 位上 .Net 4 或更高版本
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
32 位上 .Net 4 或更高版本
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
64 位上 .Net 3 或更低版本
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe executeQueuedItems
32 位上的 .Net 3 或更低版本
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 在低优先级后台线程上运行(显然只是随机启动),其想法是它不应该让其他进程耗尽 CPU - 尽管这并不总是有效。以交互方式运行 ngen 比让它在后台运行更快 - 但它会对性能产生更大的影响。需要多长时间取决于您的硬件以及需要重新编译多少/哪些本机映像。
答案2
为什么会出现此错误“.Net 运行时优化服务”?其发生的主要原因是 Windows 更新错误,但还有许多其他原因,如下所述:-
-注册表设置错误
-资源占用
- .NET Framework 更新有缺陷
这些就是其发生的原因,现在让我们进入解决方案部分。