C# - 如何知道当Windows启动后,“定居”?(C# - How to know when W

2019-07-29 07:29发布

我正在写必须在Windows启动时运行的选项的应用程序。

当应用程序陷入我的电脑下它已真正解决之前,我受不了了,这是一个非关键应用。 我想我的应用程序礼貌地等待其他所有启动项来完成和解决,使用户的PC变成响应它开始做任何工作之前。

我怎么会去检测这个条件? 我想我可以遍历注册表,查找所有的启动进程正在运行,或使用一个稍长的定时器。 我只希望有另一种更小的hackish招我可能会使用。

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

Answer 1:

A“稍长”定时器是最好的途径。 我不会触摸到注册表以bargepole。

你会想,虽然考虑的一件事是,如果用户想发布您的计划本身会发生什么? 显然,你不想被延误了,然后。

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

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

最后一点,如果你的程序是不关键的,你担心它可能会慢下来,考虑降低应用程序的优先级。



Answer 2:

看来这是在用户的手中最好的东西留下的类型,和Windows已经提供了很好的选择,以控制这一点,至少对Windows服务。

如果这是一个Windows服务,该服务可以被配置为启动自动(延时启动)

也许这是最好的选择?

如果你不想去的路线,或者如果你的程序是不是Windows服务,检测时,“定居”的Windows是非常主观且容易出错。 你可以监视磁盘IO作为一个有点可靠的指标。 磁盘IO通常是在启动过程中的瓶颈(尤其是对于系统而不SSD OS驱动器)。 你可能会得到“settledness”等待磁盘IO(由性能计数器指示)的合理近似下降到低于某一阈值。 您可能希望等待时间不超过可配置的时间量,然后开始无论如何,因为有些系统可能启动,并开始执行,税收的IO子系统无关,长时间运行的任务。



Answer 3:

两个建议:

  1. 使用低优先级的线程做你的工作。 毕竟,这是一个低优先级的,对不对? 仅这一点就已经成功地减少了启动影响的好机会。
  2. 如果你真的要等待事情解决 - 只需检查处理器和内存利用率,而不是尽一切注册表读取或等待的任意时间量。 在该指令是在这里: 如何获得在C#中的CPU使用率?

祝好运!



Answer 4:

较晚(四年),这里的党,但万一别人绊倒在这个Q&A像我一样......我问过类似的问题 ,但我关注的是知道什么时候的事情了用户登录,在以前安定下来。 据我所知,OP的应用程序从桌面上运行,并具有用户界面元素,等等。但是,如果你检查线程,你会看到有办法告诉Windows是否已完成加载的服务。 因此,一个服务可以在启动时运行,清除“完成”的旗帜,等待服务启动,然后设置标志。 现在,当用户登录项,如果系统仍然在它的方式,应用程序就知道了,不急于初始化UI。 如果“完成”标志设置,用户界面可以“放心”关于在大部分或所有其他应用程序都做自己的事情的认识开始。 这有可能是用户将在登录后启动另一个应用程序。因此,完成标志置位,但事情仍然可以继续。 这是像CPU使用率等建议的检查是很有价值的地方。



文章来源: C# - How to know when Windows is “settled” after startup?