10

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

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

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

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

4

4 回答 4

4

'longish' 计时器是最好的方法。我不会用 bargepole 碰注册表。

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

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

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

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

于 2012-05-08T15:41:37.723 回答
2

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

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

也许这是最好的选择?

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

于 2012-05-08T15:42:48.893 回答
1

两个建议:

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

祝你好运!

于 2012-05-08T16:07:21.590 回答
1

在这里聚会晚了(四年),但万一其他人像我一样偶然发现这个问答......我问了一个类似的问题但我的重点是在用户登录之前知道事情何时稳定下来。我了解 OP 的应用程序是从桌面运行并具有 UI 元素等。但是如果您检查该线程,您会发现有一种方法可以判断 Windows 是否已完成加载服务。因此服务可以在启动时运行,清除“完成”标志,等待服务启动,然后设置该标志。现在,当用户登录时,如果系统仍在启动中,应用程序将知道并且不会急于初始化 UI。如果设置了“完成”标志,则 UI 可以在知道大多数或所有其他应用程序已完成其工作的情况下开始“感到舒服”。用户登录后可能会启动另一个应用程序。因此,将设置完成标志,但事情仍可能继续进行。

于 2016-01-18T00:57:02.583 回答