Windows服务挂起在启动过程中启动

我们有两个在Visual Studio .NET 2008中用VB.NET开发的服务。 两者都是由单独的个人(其中一个是我自己)完全分开开发的,但两者在启动过程中都报告了相同的错误:启动后,系统事件日志中会显示“服务在启动时挂起”。 在该消息之后,服务继续正常启动(仅仅几条消息就是服务启动的通知)。 有没有关于加载.NET框架或JIT编译导致这个或什么的代码缓慢的东西? 它手动完成时启动和停止罚款。 Mine是一个非常简单的服务,除了框架提供的启动代码之外,没有启动代码。

更新1:这是我在OnStart得到的一切:

host = New ServiceHost(GetType(FSE.Licensing.FSELicense)) host.Open() 

FSELicense没有定义构造函数,所以它只是获取VB.NET提供的默认空公共构造函数。

更新2:我的问题已经根据一位同事提出的解决scheme而变化,而这个解决scheme据说解决了这个问题。 这个解决scheme实际上只是添加了一个我认为不必要的服务的依赖关系,因为我的服务在做出请求之前什么都不做。 但是,它确实声明了一个COMtypes的variables。 是否有可能引用此COMtypes(即使没有实例)将导致COM DLL与服务同时加载,并可能依赖于服务? 如果是的话,我没有意识到COM引用就像.NET中的静态链接。

我通过向“HTTP SSL服务”(HTTPFilter)的服务添加服务依赖项来解决我的问题。 我在使用.NET编写的Windows服务的XP计算机上遇到了与使用netpipe和http绑定公开的WCF端点完全相同的问题。 当系统启动时,它总是挂在主机上。打开()调用,并最终超时。 我可以手动启动服务,没有问题。

有关添加服务依赖关系的说明,请参阅此链接。 我使用的DependOnService值是HTTPFilter

尽量减少OnStart的处理; 特别是避免阻塞未知的时间; 例如,不要尝试连接远程计算机 – 没有数据库查询,没有服务请求。

如果您需要做一些可能会阻塞或花费很长时间的事情,请尽可能为此任务创建一个单独的线程。

但是,您不能始终避免完全阻止,因为您需要确保从OnStart返回时您的服务是可操作的。 在这种情况下,您可以使用ServiceBase.RequestAdditionalTime来请求更多的时间让OnStart完成。

在HTTPFilter上添加一个依赖项有时可以解决我们的问题。 我们对一些Windows server 2008系统使用了这种解决方法。 这个HTTPFilter服务似乎没有安装在某些Windows 7 Professional 64位系统上,这实际上会导致wcf服务主机无法启动的问题(无法找到依赖关系)。

这是一个猜测,但是在系统启动时,幕后加载了很多东西,这已经降低了速度。

那么你也必须担心依赖于其他服务的组件开始。 例如,如果您的服务依赖于依赖于SQL server数据库引擎服务的SQL server代理,则必须等待依次加载。

所以…

根据FSE.Licensing.FSELicense在内部执行的操作,它可能正在等待首先加载的其他服务,或者可能只是计算机速度较慢,并且同时加载所有后台进程而您的服务只是与所有这些流程竞争资源。

但是,你看到的警告我只是一个警告。 我在我的一些服务上看到了这一点,可能需要一段时间才能加载。 这是显而易见的,我可能甚至不需要说出来,但服务控制管理器期望服务在特定时间段内加载(我不知道是什么),但是如果服务似乎挂起,它会记录这个消息,但与此同时,该服务仍在尝试加载。 只要你的服务开始,我不会太担心这个警告,除非你能看到一些更好的方法来避免这种情况。

有一件事你可以检查在服务控制台,看看你的服务的属性,看看“依赖”选项卡。 它可能是空白的,但它可能会给你一些见解。