在需要处理耗时比较长或者需要定时处理的事务时我们会采用windows services来处理。那么应该怎么使用定时器呢?下面直接上代码!
需要引入命名空间:System.Timers
Timer timer = new Timer(300000 ); //定义一个定时器对象
protected override void OnStart(string[] args)
{
timer.Enabled = true;
timer.Start();
timer.Elapsed += timer_Elapsed;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
//事务处理关键代码
doWork();
}
catch (Exception ex)
{
Log.Error(ex);
}
}
一般把要处理的代码写在函数doWork()中就可以了,今天要讲的重点不是这个!
如果函数doWork()要处理的事务耗时比较长,假如处理一次可能需要五分钟,可能需要一个小时,也可能是五个小时,处理事务所需的时间不固定。我希望这个服务能够及时的处理,所以我设置定时器不宜过长。那么我就设置五分钟,也就是300000毫秒。定时器每五分钟就会执行一次doWork(),那么问题来了!如果doWork函数的任务还没执行完,已经过了五分钟,定时器会再次触发,导致重复执行doWork()函数,可能会出现不必要的错误。这个时候我们需要增加一个全局变量来判断当前的任务是否执行完成,修改后的代码如下:
Timer timer = new Timer(300000 ); //定义一个定时器对象
bool isRun=false;
protected override void OnStart(string[] args)
{
timer.Enabled = true;
timer.Start();
timer.Elapsed += timer_Elapsed;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if(isRun==false){
isRun=true;
try
{
//事务处理关键代码
doWork();
}
catch (Exception ex)
{
Log.Error(ex);
}
isRun=false
}
}
这样我们就实现了一个定时处理任务的Windows 服务啦。
网友评论