服务器启动超时

时间:2009-09-21 21:49:31

标签: wcf windows-services

我找到了这篇文章,

windows service startup timeout

但只是想澄清一点,我在C#.NET中编写了一个Windows服务,有时会出现超时错误,例如

达到超时(30000毫秒)....启动服务时

原因是它在启动方法中做了一些WCF工作,它在大多数情况下工作正常,但是如果你的计算机在启动时陷入困境,例如它会导致它花费更长的时间。我现在意识到代码的结构不应该那样。

从启动方法启动后台线程并完成在那里做WCF的东西是一个可接受的解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:1)

与所有应用程序一样,Windows服务也有一个入口点。在C#中,这称为Main(),并且是某个类的静态方法。在Windows服务的Main()函数中,您应该具有类似于此的东西:

ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsService() };
ServiceBase.Run( ServicesToRun );

在此示例中,MyWindowsService是要运行的Windows服务类的名称,应替换为Windows服务类名称。

当在Main()中执行此代码时,将调用Windows服务类的默认构造函数,如下所示:

public MyWindowsService()
{
    // service instance initialization goes here...
}

这是初始化MyWindowsService实例的地方。

现在,MyWindowsService类应该来自System.ServiceProcess.ServiceBase。如果是这样,那么您可以覆盖OnStart()方法,该方法在服务控制管理器向服务发送命令时调用。

protected override void OnStart(string[] args)
{
    // things to do when starting the service...
}

一旦OnStart()函数返回,您的服务就会有效运行,即启动。

所以,问题是在这个事件链中发生了延迟 - 在Main(),服务构造函数或OnStart()回调方法中。您是否尝试过调试服务?一种简单的方法是将以下代码行放在服务的Main()函数中:

System.Diagnostics.Debugger.Break();

启动服务时,系统将提示您选择调试器。只需选择一个新的Visual Studio实例,您就可以直接跳转到进行此Break()调用的位置。您可以从那里进行调试,在相关位置(构造函数,OnStart())中设置断点以查看挂断发生的位置。