Windows服务挂起启动时启动

时间:2009-08-05 16:03:10

标签: .net windows vb.net clr

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

更新1: 这就是我在OnStart中的所有内容:

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

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

更新2: 我的问题已根据一位同事提出的解决方案而变形,该同事据称解决了这个问题。事实上,这个解决方案只是添加了一个我认为不必要的其他服务的依赖,因为我的服务在发出请求之前没有做任何事情。但是,它确实声明了COM类型的变量。是否有可能引用此COM类型(即使没有实例)将导致COM DLL与服务同时加载,并可能依赖于服务?我没有意识到COM引用就像.NET中的静态链接一样。

4 个答案:

答案 0 :(得分:4)

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

有关adding a service dependency的说明,请参阅此链接。我使用的DependOnService值为HTTPFilter

答案 1 :(得分:2)

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

如果你需要做一些可能阻塞或需要很长时间的事情,如果可能的话,为这个任务产生一个单独的线程。

但是,您无法始终完全避免阻止,因为您需要确保从OnStart返回时您的服务正常运行。在这种情况下,您可以使用ServiceBase.RequestAdditionalTimeOnStart请求更多时间来完成。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这是一个猜测,但是在系统启动期间,很多事情都在幕后加载,这已经使事情变慢了。

然后您还必须担心依赖其他服务的组件才能启动。例如,如果您的服务依赖于依赖于SQL Server数据库引擎服务的SQL Server代理,则必须等待依赖项的顺序加载。

因此...

取决于FSE.Licensing.FSELicense在内部执行的操作,它可能正在等待它依赖的其他服务首先加载,或者它可能只是机器运行缓慢,并且加载所有后台进程发生在同时,您的服务只是与所有这些流程竞争资源。

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

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