C# - 如何知道Windows在启动后何时“建立”

本文关键字:何时 建立 启动 何知道 Windows | 更新日期: 2023-09-27 18:33:27

我正在编写一个应用程序,该应用程序可以选择在Windows启动上运行。

当应用程序在PC真正稳定之前使我的PC陷入困境时,我无法忍受,这是一个非关键的应用程序。 我希望我的应用程序礼貌地等待所有其他启动项完成并解决,以便用户的 PC 在开始执行任何工作之前变得响应。

我将如何检测这种情况? 我想我可以遍历注册表并查找所有正在运行的启动进程,或者使用长计时器。 我只是希望我可能会使用另一个不那么黑客的技巧。

编辑:应用程序具有UI,不能作为服务运行。 它确实具有托盘模式。 它执行一些图像渲染。

C# - 如何知道Windows在启动后何时“建立”

"长"计时器是最好的路线。我不会用驳船杆触摸注册表。

不过,您需要考虑的一件事是,如果用户想要自己启动您的程序,会发生什么?显然,您不想造成延迟。

我假设您的应用程序有 UI?如果没有,您可以考虑在 Vista/7 上将其启动类型设置为"自动(延迟("的服务

另请参阅此相关问题:如何在 c# 中创建延迟启动应用程序?

最后一点,如果您的程序不重要,并且您担心它可能会减慢速度,请考虑降低应用程序的优先级。

这似乎是最好留给用户的东西,Windows已经提供了一个很好的选择来控制这一点,至少对于Windows服务。

如果这是 Windows 服务,则可以将该服务配置为自动启动(延迟启动(

也许这是最好的选择?

如果您不想走这条路,或者您的程序不是 Windows 服务,则检测 Windows 何时"稳定"是非常主观且容易出错的。 您可以将磁盘 IO 监视为一个比较可靠的指示器。 磁盘 IO 通常是启动期间的瓶颈(尤其是对于没有 SSD 操作系统驱动器的系统(。 您可能会获得"稳定度"的合理近似值,等待磁盘 IO(如性能计数器所示(降至特定阈值以下。 您可能希望等待不超过可配置的时间量,然后无论如何启动,因为某些系统可能会启动并开始执行不相关的长时间运行的任务,这些任务会给 IO 子系统带来负担。

两个建议:

  1. 使用低优先级线程来完成您的工作。毕竟,这是一个低优先级,对吧?仅此一项就很有可能成功将启动影响降至最低。
  2. 如果你真的想等待事情解决 - 只需检查处理器和内存利用率,而不是做所有的注册表读取或等待任意时间。有关这方面的说明在这里: 如何在 C# 中获取 CPU 使用率?

祝你好运!

晚了

(四年(到这里的派对,但万一其他人像我一样偶然发现了这个问答......我问了一个类似的问题,但我的重点是在用户登录之前知道事情何时安定下来。我知道OP的应用程序是从桌面运行的,并且具有UI元素等。但是,如果您检查该线程,您会发现有一种方法可以判断Windows是否已完成加载服务。因此,服务可以在启动时运行,清除"完成"标志,等待服务启动,然后设置该标志。现在,当用户登录时,如果系统仍在上升过程中,应用程序将知道并且不急于初始化UI。如果设置了"done"标志,则 UI 可以"放心"地开始知道大多数或所有其他应用都已完成其操作。用户可能会在登录后启动另一个应用程序。因此,将设置完成标志,但事情仍可能继续。这是其他建议的检查(如 CPU 使用率(有价值的地方。