C#Window Service不调用计时器函数

时间:2017-09-11 16:33:40

标签: c# windows-services system.timers.timer

在我的Window Service应用程序中,永远不会调用计时器功能。我在我的机器上部署了服务,然后将服务附加到Visual Studio,并在不同的功能上使用断点。 OnStart()之后我的所有函数都没有被调用。

这是我的OnStart()功能

protected override void OnStart(string[] args)
{
    this.timer = new System.Timers.Timer(50000);
    this.timer.AutoReset = true;
    this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick);
    this.timer.Start();
}

更新于09/12/2017:在try和catch中添加了事件日志 然后,此函数调用timer1_tick()

 private void timer1_Tick(object sender, EventArgs e)
 {
     try
     {
         EventLog.WriteEntry("Running.."+ e.ToString());
     }
     catch (Exception ex)
     {
         EventLog.WriteEntry("Caught Exception "+ex.ToString(), EventLogEntryType.Error);
     }
 }

永远不会调用timer1_tick。有什么建议吗?

2009年12月12日更新:我查看了事件日志。在Windows日志下>应用程序,我可以看到消息,服务启动成功。但是,不会显示try-catch块中添加的事件日志。不确定我是否遗漏了什么。

我将服务附加到Visual Studio进行调试。在下图中,调用OnStart()方法。我刚刚添加了Thread.Sleep(30000),以便我有一些缓冲时间将进程附加到调试器,以避免跳过OnStart()函数

enter image description here

Timer启动后,我在TimerTick()函数上有一个断点,期望它被命中,但它永远不会

enter image description here

1 个答案:

答案 0 :(得分:2)

timer1_Tick可能会被调用,因为OnStart中的所有内容似乎都合适。也许你没有收到电子邮件的原因是因为_SendEmail正在抛出异常。

EventLog可能会提供更多信息吗?

private void timer1_Tick(object sender, EventArgs e)
{
    try
    {
        SendMail._SendMail("Processing A started at" + DateTime.Now.ToString());
        Logging.log.LogInput("start refund process");
    }
    catch (Exception ex)
    {
        EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
    }
}

作为最佳做法,我还会写信至EventLogOnStart中的OnStop

protected override void OnStart(string[] args)
{
    // Log a service start message to the Application log.
    EventLog.WriteEntry("My Service in OnStart.");

    timer = new System.Timers.Timer(50000);
    timer.AutoReset = true;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick);
    timer.Start();
}

protected override void OnStop()
{
    // Log a service stop message to the Application log.
    EventLog.WriteEntry("My Service in OnStop.");
}