C# – 如何知道什么时候Windows启动后“解决”?

我正在编写一个应用程序,将有一个选项在Windows启动运行。

在应用程序崩溃之前,我无法忍受这个应用程序的崩溃,这是一个非关键的应用程序。 我希望我的应用程序能够礼貌地等待所有其他启动项目完成并解决,以便用户的PC在开始工作之前变得响应。

我将如何去检测这种情况? 我想我可以遍历registry,并查找所有启动进程运行,或使用较长的计时器。 我只是希望有一个可能使用的更less的黑客技巧。

编辑:应用程序有一个用户界面,不能作为服务运行。 它有一个托盘模式。 它做了一些图像渲染。

Solutions Collecting From Web of "C# – 如何知道什么时候Windows启动后“解决”?"

一个“长”的计时器是最好的路线。 我不会用注射器触摸注册表。

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

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

请参阅这个相关的问题: 如何在C#中创建延迟启动应用程序?

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

看来这是最好留在用户手中的类型,而Windows已经提供了一个很好的选择来控制这个,至少对于Windows服务来说。

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

也许这是最好的选择?

如果你不想走这条路,或者如果你的程序不是Windows服务,那么检测Windows何时“安定”是相当主观和容易出错的。 你可以监视磁盘IO是一个有点可靠的指标。 磁盘IO通常是启动期间的瓶颈(特别是对于没有SSD操作系统驱动器的系统)。 您可能会得到一个合理的“稳定度”,等待磁盘IO(如性能计数器所示)下降到某个阈值以下。 您希望等待的时间不能超过可配置的时间,然后以任何方式启动,因为有些系统可能会启动并开始执行不相关的,长期运行的任务,从而对IO子系统征税。

两点建议:

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

祝你好运!

在这里晚了(四年),但是如果有人像我一样在这个问题上绊倒了…我问了一个类似的问题,但我的重点是知道什么时候事情在用户登录之前就已经解决了。 我知道OP的应用程序是从桌面运行的,并具有UI元素等,但如果你检查该线程,你会看到有一种方法可以告诉Windows是否已经完成加载服务。 因此服务可以在启动时运行,清除“完成”标志,等待服务启动,然后设置该标志。 现在当用户登录时,如果系统仍然在运行,应用程序将知道而不是急于初始化用户界面。 如果设置了“完成”标志,用户界面可以“开始感觉舒服”,因为大多数或所有其他应用程序已经完成了他们的工作。 用户登录后可能会启动另一个应用程序。因此,完成标志将被设置,但事情可能还在继续。 这是其他建议的CPU使用检查将有价值的地方。