我使用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。
帮助?
答案 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)
首先,您确定要让您的服务生成一个新线程来执行此操作吗?你不能简单地在主线程上做到这一点吗?
要调试您的问题,请执行以下一项或两项操作:
答案 2 :(得分:0)
对,我已经知道了。我在使用配置文件做了些蠢事,包括将.exeXML配置文件移到错误的位置。这导致配置错误,并且服务不喜欢它。我现在已经开始运行了。谢谢你的帮助。