我正在创建一个Windows服务,在安装服务后,它会立即停止并启动,但它根本不应该。以前,我收到的错误是服务没有及时响应start命令,所以我把init代码拿出来放在一个线程中,现在我在这里:
protected override void OnStart(string[] args)
{
this.EventLog.WriteEntry("ATNotifier Started");
ThreadPool.QueueUserWorkItem(WaitOnEmailsChanged);
ThreadPool.QueueUserWorkItem(Init, "IP");
}
waitonemailschanged线程只是创建一个filesystemwatcher来监视设置文件(xml文档)是否发生了变化,如果发生这种情况,则加载该文件中的数据。目前,这只是无限期等待(这是一般情况,因为一年只会改变几次),因为没有对xml文档进行任何更改。
Init线程可以执行各种操作,包括创建和启动System.Timers.Timer对象,其Elapsed方法是服务的主要部分。
我无法理解为什么它会开始然后立即停止。我还应该注意,eventviewer没有显示来自此应用程序的日志。
编辑>我尝试创建“正确”的线程,结果相同,除了创建和启动计时器之外,我已经删除了所有内容,如下所示:
protected override void OnStart(string[] args)
{
this.EventLog.WriteEntry("ATNotifier Started");
m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins
m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed);
m_Timer.Start();
}
我仍然收到相同的消息。这几乎就像OnStart永远不会被调用一样。
答案 0 :(得分:3)
如果主线程在异常时终止,它可能会意外停止。
答案 1 :(得分:3)
您发布的代码对我没有意义。为什么在创建Timer之前设置事件处理程序?
m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed);
m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins
不应交换这两行吗?
答案 2 :(得分:2)
问题最严重的是EventLog.WriteEntry抛出错误,因为没有与之关联的EventSource。见http://msdn.microsoft.com/en-us/library/xzwc042w.aspx
答案 3 :(得分:1)
据我所知,您必须主动向服务经理报告该服务已成功启动 - 否则,OnStart方法将返回,如果尚未报告状态更改,则服务管理器将假定服务终止而没有实际成功加载自己。
将服务报告为已成功启动由服务基类完成IIRC,因此将以下内容添加到OnStart
方法的底部:
base.OnStart(args);
答案 4 :(得分:0)
ThreadPool线程是后台线程;他们不会让一个过程保持活力。我怀疑你需要一个“正确的”线程......
尝试:new Thread(SomeCode).Start();
或类似。