2012-11-13 133 views
1

我们已经自动启动服务,在某些情况下,它会花费很多时间加载必要的数据,比如说10分钟。在此期间,它按预期运行(处理一些需要启动的大量数据文件)。我通过C++ SetServiceStatus函数报告该过程,它工作正常。服务块窗口启动

这个服务不依赖于任何东西,只有一个依赖,这也是我们自己的服务。它在这10分钟后启动,它需要第一个“服务器”服务完全运行以接受请求。

我认为Windows会启动所有其他自动服务(通常在不到10分钟内),然后开始正常工作,但系统在启动过程中被完全阻止(我无法登录到计算机或ping计算机),直到此一个特定的服务被启动(由SetServiceStatus报告SERVICE_RUNNING)。当服务完全启动时,其他缺失的系统服务(网络,远程桌面所需的任何服务都是随机的)也将启动。这是正常的行为吗?为什么不依赖进程(如远程桌面,网络连接等)等待这个过程?我错过了什么吗?

我试图添加一些依赖来推迟我的服务的启动,但我最终有很多依赖和行为仍然以某种方式随机(作为服务的顺序是随机的)。有时候我可以登录,但是例如开始按钮只有在我的服务开始10分钟后才开始工作。我不确定什么是“最后的服务”依赖和什么样的服务包含到我的依赖列表中,在某些计算机上,这些服务可以被禁用,并且可能带来新的问题......所以我不喜欢这个解决方案非常。

另一种选择是我们服务的延迟启动选项。这应该在所有其他自动服务正在运行时开始服务。那么,这工作正常,Windows靴子,电脑运行和响应,我们的服务开始,但表现非常糟糕,比通常慢许多倍,似乎延迟开始服务有更低的优先级或类似的东西。我现在唯一的解决方案是向系统报告我的服务正在运行(通过SetServiceStatus函数),但要继续加载(这个工作,我测试了它)。但是,我们的依赖服务存在问题,因为它需要在第一个服务真正准备就绪时启动。它可以解决,但我仍然想知道这是怎么可能的,如果有什么我可以用来保持自动启动服务的当前状态,当它真正完全启动并准备工作时报告“启动”。感谢您的任何想法。

+2

尽快设置“SERVICE_RUNNING”,然后继续在后台处理。使您的其他服务具有弹性,可以处理处于运行状态的第一个服务,但尚未准备好提供服务。 –

+0

是的,谢谢,这是我目前的解决方案。如果将服务设置为运行状态(如果尚未运行并正在侦听)(服务器应用程序及其客户端),然后尝试为其提供一些解决方法,似乎有点奇怪。如果Windows希望被阻止,那么确定,但是如果它显着降低了服务的速度,那么延迟的启动是什么呢?我只是在想,也许其他服务因为某些资源(权利,无论什么)而被阻止,这些资源可以在某个时间只分配给一个服务,或者我可以以某种方式释放它,设置一些标志idk。 – Martin

+0

David的描述是启动潜在的长时间加载服务启动的方式。如果无法正确加载,您的服务始终可以终止(干净地)。它可以进一步公开相应的服务控制API以允许查询真实就绪状态。是的,这是一种痛苦,但它与SCM很好地结合在一起,它总是*一个好主意(绝不会咬你的手)。 – WhozCraig

回答

0

尽快设置SERVICE_RUNNING,然后继续在后台处理。使您的其他服务具有弹性,可以处理处于运行状态的第一个服务,但尚未准备好提供服务。 服务处于起始状态的时间越长,我们从不同的Windows版本获得的问题越多。