我正在编写一个可以在Windows Startup上运行的应用程序。
当应用程序在我的PC真正解决之前陷入困境时,我无法忍受,这是一个非关键应用程序。我希望我的应用程序礼貌地等待所有其他启动项目完成并解决,以便用户的PC在开始执行任何工作之前变得响应。
我如何检测这种情况?我想我可以遍历注册表并查找所有正在运行的启动进程,或者使用长时间计时器。我只是希望我可以使用另一种不那么狡猾的技巧。
编辑:应用程序具有UI,无法作为服务运行。它有一个托盘模式。它做了一些图像渲染。
答案 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)
两个建议:
答案 3 :(得分:1)
相当晚(四年)参加派对,但万一其他人偶然发现这个Q& A就像我做的那样......我问similar question但我的重点是知道什么时候事情安定下来用户登录。我知道OP的应用程序是从桌面运行的,并且有UI元素等。但是如果你检查那个线程,你会发现有一种方法可以判断Windows是否已经完成加载服务。因此,服务可以在启动时运行,清除“完成”标志,等待服务启动,然后设置该标志。现在,当用户登录时,如果系统仍处于运行状态,则应用程序将知道并且不急于初始化UI。如果设置了“完成”标志,则用户可以“熟悉”开始知道大多数或所有其他应用程序已经完成了他们的事情。登录后用户可能会启动另一个应用程序。因此,将设置完成标志,但事情仍然可能继续。这是其他建议的检查,如CPU使用量的地方。