Windows服务立即停止并启动,但它不应该

时间:2009-02-17 22:03:53

标签: c# windows-services

我正在创建一个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永远不会被调用一样。

5 个答案:

答案 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();或类似。