防止.NET 运行时优化服务依靠电池运行?

防止.NET 运行时优化服务依靠电池运行?

今天早上我打开笔记本电脑时,它已经自行重启(安装更新后)。现在,.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 自行运行。对于台式电脑,有两个选择:

  1. 使用下面适当的 ngen 命令在桌面上创建一个 .bat 或 .ps1 文件 - 只需双击并等待 ngen 关闭即可拔下电源。如果您在 Windows 文件夹中创建脚本并在桌面上创建快捷方式,您也可以使用命令或 Powershell 提示符或运行对话框根据需要执行它(拔下电源之前/更新之后)。

  2. 另一个可行的选择是使用计划任务来执行上述脚本。在启动时以管理员身份运行它,无需登录用户。如果您的笔记本电脑被允许在夜间安装更新并且可以重新启动,那么这应该可以很好地工作。

要运行 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 更新有缺陷

这些就是其发生的原因,现在让我们进入解决方案部分。

  1. 扫描您的电脑(您可以使用防病毒软件,也可以使用 Windows Defender 扫描程序

  2. 重新启动 NVIDIA Telemetry Container 服务(打开服务并转到 NVIDIA Telemetry Container 并重新启动它,如果它停止了则启动它,否则重新启动它。

  3. 使用命令提示符

  4. 使用微软官方的脚本文件。下载此脚本文件或者您也可以从 Github 获取它,然后将其放在单独的文件夹中。运行 DrainNGenQueue.wsf 文件。如果提示询问您要运行哪种类型的程序,请选择 Windows Script Host。最后,等待提示完成其工作,然后检查问题是否已解决。

相关内容