C# - 如何知道启动后Windows何时“已确定”?

时间:2012-05-08 15:38:38

标签: c# windows startup boot

我正在编写一个可以在Windows Startup上运行的应用程序。

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

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

编辑:应用程序具有UI,无法作为服务运行。它有一个托盘模式。它做了一些图像渲染。

4 个答案:

答案 0 :(得分:4)

“长”计时器是最好的选择。我不会用bargepole触摸注册表。

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

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

另请参阅此相关问题:How to create delay startup application in c#?

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

答案 1 :(得分:2)

这似乎是用户手中最好的东西,Windows已经提供了一个很好的选项来控制它,至少对于Windows服务而言。

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

也许那是最好的选择?

如果您不想使用该路由,或者您的程序不是Windows服务,则检测Windows何时“已确定”是非常主观且容易出错的。您可以监视磁盘IO作为一个可靠的指标。磁盘IO通常是启动期间的瓶颈(特别是对于没有SSD OS驱动器的系统)。您可能会得到一个合理的“稳定性”近似值,等待磁盘IO(由性能计数器指示)降至某个阈值以下。您可能希望等待不超过可配置的时间,然后以任何方式启动,因为某些系统可能会启动并开始执行对IO子系统征税的无关,长时间运行的任务。

答案 2 :(得分:1)

两个建议:

  1. 使用低优先级的线程来完成您的工作。毕竟,这是一个低优先级,对吧?仅这一点就很有可能成功地减少启动影响。
  2. 如果你真的想等待事情解决 - 只需检查处理器&内存利用率,而不是所有的注册表读取或等待任意时间。有关这方面的说明,请访问:How to get the CPU Usage in C#?
  3. 祝你好运!

答案 3 :(得分:1)

相当晚(四年)参加派对,但万一其他人偶然发现这个Q& A就像我做的那样......我问similar question但我的重点是知道什么时候事情安定下来用户登录。我知道OP的应用程序是从桌面运行的,并且有UI元素等。但是如果你检查那个线程,你会发现有一种方法可以判断Windows是否已经完成加载服务。因此,服务可以在启动时运行,清除“完成”标志,等待服务启动,然后设置该标志。现在,当用户登录时,如果系统仍处于运行状态,则应用程序将知道并且不急于初始化UI。如果设置了“完成”标志,则用户可以“熟悉”开始知道大多数或所有其他应用程序已经完成了他们的事情。登录后用户可能会启动另一个应用程序。因此,将设置完成标志,但事情仍然可能继续。这是其他建议的检查,如CPU使用量的地方。