2009-08-05 194 views
2

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

更新1: 这是我的一切处理通信:

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

FSELicense没有定义构造函数,所以它只是得到通过VB.NET提供的默认为空公共构造,我猜测。

更新2: 我的问题已经演变为基于一位同事提出的解决方案,该解决方案据说解决了问题。事实上,这个解决方案实际上只是添加了一个我认为不必要的服务的依赖关系,因为我的服务在请求完成之前不会执行任何操作。但是,它确实声明了一个COM类型的变量。是否有可能引用此COM类型(即使没有实例)会导致COM DLL与服务同时加载,并且可能依赖于服务?如果是的话,我没有意识到COM引用就像.NET中的静态链接。

+0

根本没有启动代码?甚至没有实例化一个监听事件的类?如果在启动时没有做任何事情,这个服务究竟做了什么? – David 2009-08-05 16:47:20

+0

是的,它实例化一个侦听事件的类,但我把它当作框架代码:)我想这不是真的。 – BlueMonkMN 2009-08-05 19:40:07

+0

host.Open()是做什么的? 通常,您不应该在OnStart方法中执行任何工作。您应该启动一个线程来完成实际工作,以便OnStart方法能够及时返回。 – 2009-08-06 17:16:51

回答

4

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

请参阅此链接了解adding a service dependency上的说明。我使用的DependOnService值是HTTPFilter

+0

我通过在IPSEC服务(PolicyAgent)上添加服务依赖性修复了此问题 – 2010-01-22 18:44:43

+0

在其他服务中随机添加依赖项是一种脆弱的解决方案。 – oefe 2010-05-05 08:12:30

+0

我同意oefe,虽然我们的解决方案不是随机的;他们被科学证明有效果。 (我自己花了两个小时测试HTTPFilter的依赖关系,以确保结果是可重复的。)我们的解决方案的问题是我们不明白“为什么”他们缓解了这个问题。 – 2010-05-11 15:27:33

0

这是一个猜测,但在系统启动期间,许多事情在幕后加载,这已经减慢了速度。

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

所以......

根据什么FSE.Licensing.FSELicense内部做,它可能是在等待,它依赖于第一加载其他服务,或者它可能只是机器很慢,而且加载所有后台进程的同时发生,您的服务只是与所有这些进程竞争资源。

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

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

+0

大多数系统上都会发生此问题,包括没有任何臃肿的新快速系统。只有基于.NET的服务报告这些错误。我们已经承认,这只是一个警告,但是现在有多个客户在问及这些问题,现在我们正在寻求答案。该服务没有依赖关系,就像我说的那样,这是一项非常简单的服务。其他人在那里创建VB.NET服务并没有这个问题吗? – BlueMonkMN 2009-08-06 00:32:11

+0

对不起。我只有我的一个服务有这个问题,我知道为什么需要这么长时间才能开始发生。我从来没有遇到过这种非常简单的服务,而且我写了很多。抱歉,我无法提供更多帮助。 – David 2009-08-06 03:20:45

2

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

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

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

1

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