【问题标题】:Server Startup Timeout服务器启动超时
【发布时间】:2009-09-21 21:49:31
【问题描述】:

我找到了这篇文章,

windows service startup timeout

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

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

原因是它在启动方法中执行了一些 WCF 操作,大多数情况下都可以正常工作,但是如果您的计算机在启动时陷入困境,例如它可能会导致它需要更长的时间。我现在意识到代码不应该是这样的结构。

从启动方法启动后台线程并在其中完成 WCF 工作是一种可接受的解决方案吗?

谢谢。

【问题讨论】:

  • 其实我的问题有点误导。更多信息...此 Windows 服务正在启动“服务器”,因此启动方法应该相对即时(我将在某个阶段对其进行计时)。我的意思是它没有连接到其他任何东西,所以应该没有延迟。我的日志实际上显示,当这些超时发生时,根本没有调用启动方法。我猜有太多的服务试图同时启动。我对此无能为力。有什么建议吗?
  • 另一个想法,我认为服务中的启动代码没有运行,但这是基于未写入事件日志的日志消息。但是如果启动代码正在运行,并且超时,并且事件日志消息没有被写入事件日志,例如它被缓存或其他东西。

标签: wcf windows-services


【解决方案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())设置断点以查看挂断发生的位置。

【讨论】:

  • 只是为了确认马特。您的响应似乎表明服务启动超时是从触发入口点的点计算的(而不是对 ServiceBase.Run 的调用)。对吗?
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2010-09-11
  • 2018-07-16
  • 1970-01-01
相关资源
最近更新 更多