1

我想在应该以恒定间隔执行操作的 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方法中我需要为 type 启动一个新线程MailManagerClient

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

线程应该如何保持活力?

4

3 回答 3

1

在 OnStart 方法中,您可以拥有 -

MailManagerClient m;
var th = new Thread(()=>m=new MailManagerClient());
th.Start();
于 2012-04-04T15:41:51.920 回答
1

因为您在构造函数中启动计时器,所以您真正需要做的就是实例化 a MailManagerClientin OnStart。您不需要手动创建线程,因为System.Timers.Timer在.ElapsedThreadPool

public class MyService : ServiceBase
{
  private MailManagerClient mmc = null;

  protected void OnStart(string[] args)
  {
    mmc = new MailManagerClient();
  }

}

我应该指出,对于下一个查看MailManagerClient.ctor实际上正在执行任何操作的代码的程序员来说,这并不明显。最好定义一个Start方法或类似的东西来启用内部计时器。

于 2012-04-04T15:42:19.847 回答
1

您也可以考虑定义一个 Windows 任务,如这个 SO 答案中所述:什么是 Windows 版本的 cron?. Windows 操作系统将负责调度和线程。

于 2012-04-04T16:59:45.410 回答