在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
启动一个新线程。
但是我该如何启动线程?哪个方法应该是新线程的入口点?
线程应该如何保持活力?
因为您在构造函数中启动计时器,所以您真正需要做的就是在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操作系统将负责调度和线程处理。