在windows服务中使用计时器

本文关键字:计时器 windows 服务 | 更新日期: 2023-09-27 18:30:04

我想在应该以恒定间隔执行操作的windows服务中使用计时器,而不是睡眠。

假设我有以下课程。

class MailManagerClient
{
    //fields
    string someString
    //Constructor
    public MailManagerClient()
    { 
          aTimer = new System.Timers.Timer(30000);
          aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
          aTimer.Enabled = true
    }
    //methode
    public bool DoSomthingIncConstantInterval()
    {
        //Do Somthing
        return true;
    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
       DoSomthingIncConstantInterval()
    }
}

我还有一个使用OnStart方法的windows服务。

我知道在OnStart方法中,我需要为类型MailManagerClient启动一个新线程。

但是我该如何启动线程?哪个方法应该是新线程的入口点?

线程应该如何保持活力?

在windows服务中使用计时器

因为您在构造函数中启动计时器,所以您真正需要做的就是在OnStart中实例化一个MailManagerClient。您不需要手动创建线程,因为System.Timers.Timer在来自ThreadPool的线程上执行Elapsed事件处理程序。

public class MyService : ServiceBase
{
  private MailManagerClient mmc = null;
  protected void OnStart(string[] args)
  {
    mmc = new MailManagerClient();
  }
}

我应该指出,对于下一个查看代码的程序员来说,MailManagerClient.ctor实际上在做任何事情都不是显而易见的。最好定义一个Start方法或类似的方法来启用内部计时器。

在OnStart方法中,您可以使用-

MailManagerClient m;
var th = new Thread(()=>m=new MailManagerClient());
th.Start();

您还可以考虑定义一个Windows任务,正如SO回答中所解释的:cron的Windows版本是什么?。Windows操作系统将负责调度和线程处理。