为什么我的Windows服务会在大约5秒后自动退出?

时间:2010-09-28 12:56:36

标签: c# windows windows-services

我使用C#创建一个Windows服务,当调用OnStart时会从另一个类创建一个新线程。然后,这个新线程循环等待任何传入的TCP连接。或者它应该。当我启动服务时,它会在大约5秒钟后自动停止。我不知道为什么这样做。我理解,如果服务没有工作要做,但是已经为它指定了工作,服务就会自行关闭。任何人都有任何想法为什么会发生这种情况?我的OnStart方法如下所示:

protected override void OnStart(string[] args)
    {
        Thread thread = new Thread(new StateMachine().AcceptConnections);
        thread.Start();      
    }

然后调用此方法:

        Int32 port = 13000;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        server = new TcpListener(localAddr, port);

        // Start listening for client requests.
        server.Start();
        // Enter the listening loop.
        do
        {
            client = server.AcceptTcpClient();
            ReceivedData();                
        } while (true);
    }

它不会保持足够长的时间以允许任何客户端连接到TcpListner。

帮助?

3 个答案:

答案 0 :(得分:1)

首先,确保在未设置为服务时应用程序代码运行正常。如果您的代码在未设置为服务时运行正常,我猜您的OnStart由于某种原因需要花费太长时间。如果你无法加速,这里的信息可以让你处理必要的启动延迟。

在Win32中,您必须通过定期通知服务控制管理器(SCM)启动(和停止)进度来更新service status,否则它会认为您的服务已挂起并将其终止。如果初始化需要很长时间,您可能只需要执行一次,或者在计时器上执行此操作。当您的启动(停止)逻辑正在进行时,您告诉SCM您处于START_PENDING(STOP_PENDING)状态,一旦完成,您就告诉它您处于STARTED(STOPPED)状态。

在托管世界中,通过调用ServiceBase.RequestAdditionalTime来实现此目标。对此主题进行了全面概述here。钱报价:

  

这是您的托管服务   需要注意避免   SCM将您的服务标记为   不响应。

     
      
  • 您无需明确更新   国家; ServiceBase为此做到了这一点   你的OnStart或OnStop方法   完成
  •   
  • 你必须打电话   如果您期望,请求AdditionalAdditionalTime   超过超时的OnX方法。
  •   

答案 1 :(得分:1)

首先,您确定要让您的服务生成一个新线程来执行此操作吗?你不能简单地在主线程上做到这一点吗?

要调试您的问题,请执行以下一项或两项操作:

  1. 使用EventLog或日志框架(Log4Net)添加一些日志记录。
  2. Run your service as a console app并在Visual Studio中调试

答案 2 :(得分:0)

对,我已经知道了。我在使用配置文件做了些蠢事,包括将.exeXML配置文件移到错误的位置。这导致配置错误,并且服务不喜欢它。我现在已经开始运行了。谢谢你的帮助。