我找到了这篇文章,
windows service startup timeout
但只是想澄清一点,我在C#.NET中编写了一个Windows服务,有时会出现超时错误,例如
达到超时(30000毫秒)....启动服务时
原因是它在启动方法中做了一些WCF工作,它在大多数情况下工作正常,但是如果你的计算机在启动时陷入困境,例如它会导致它花费更长的时间。我现在意识到代码的结构不应该那样。
从启动方法启动后台线程并完成在那里做WCF的东西是一个可接受的解决方案吗?
感谢。
答案 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())中设置断点以查看挂断发生的位置。