【问题标题】:C# - How to know when Windows is "settled" after startup?C# - 如何知道 Windows 启动后何时“稳定”?
【发布时间】:2012-05-17 03:04:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • This article 可能你会感兴趣
  • 没有具体的信号。我想您可以对 CPU 负载和磁盘传输的性能计数器进行采样。
  • 好的,我必须添加以下评论:我永远不会创建默认在启动时运行的应用程序。您必须明确设置。如果你在你的应用程序中这样做,并且没有一些商业人士说如果你不这样做他们会解雇你,那么你就是一个坏人!
  • @Vlad - 谢谢。我完全理解启动选项是一种方便,不会提高启动性能。不过,感谢您提供的出色链接。
  • 这是一项服务,还是“启动”是指“登录”?如果是后者,请参阅 Raymond Chen 对stackoverflow.com/questions/10361983/…的回答@

标签: c# windows startup boot


【解决方案1】:

“长”计时器是最佳途径。我不会用 bargepole 碰注册表。

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

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

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

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

【讨论】:

  • 完全接受的答案。我想我最终会等待 CPU 使用率稳定下来,然后使用具有最低优先级的线程并允许该优先级是可配置的。我也很欣赏您对注册表的评论。那将是最后的手段:
【解决方案2】:

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

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

也许这是最好的选择?

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

【讨论】:

  • 这也是一个很好的方法。我最终使用了磁盘 IO 轮询、CPU 使用率轮询和最大等待时间的组合。
【解决方案3】:

两个建议:

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

祝你好运!

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多