时间:2021-05-25
.NETFramework中为我们提供了3种类型的Timer,分别是:
ServerTimer(System.Timers.Timer),ThreadTimer(System.Threading.Timer)和WindowsTimer(System.Windows.Forms.Timer)。
其中WindowsTimer和WinAPI中的Timer一样,是基于消息的,而且是单线程的。另外两个Timer则不同于WindowsTimer,它们是基于ThreadPool的,这样最大的好处就是,产生的时间间隔准确均匀。ServerTimer和ThreadTimer的区别在于,ServerTimer是基于事件的,而ThreadTimer是基于Callback的。
相比之下ThreadTimer更轻量级一些,所以下文主要以ThreadTimer为例,讲解如何利用ThreadTimer在ASP.NET中实现计划任务。
下面给出一个用Timer实现计划任务的类:
publicclassScheduledTask
{
privatestaticreadonlyScheduledTask_ScheduledTask=null;
privateTimerUpdateTimer=null;
//间隔时间,这里设置为15分钟
privateintInterval=15*60000;
privateint_IsRunning;
staticScheduledTask()
{
_ScheduledTask=newScheduledTask();
}
publicstaticScheduledTaskInstance()
{
return_ScheduledTask;
}
publicvoidStart()
{
if(UpdateTimer==null)
{
UpdateTimer=newTimer(newTimerCallback(UpdateTimerCallback),null,Interval,Interval);
}
}
privatevoidUpdateTimerCallback(objectsender)
{
if(Interlocked.Exchange(ref_IsRunning,1)==0)
{
try
{
//此处写你自己想执行的任务
}
catch(Exceptionex)
{
}
finally
{
Interlocked.Exchange(ref_IsRunning,0);
}
}
}
publicvoidStop()
{
if(UpdateTimer!=null)
{
UpdateTimer.Dispose();
UpdateTimer=null;
}
}
}
首先,注意一下这段:privateint_IsRunning;
_IsRunning是一个标志,它代表上一个时间间隔触发的任务是否运行完成。
为什么我们需要这个_IsRunning标志呢?
因为,如果我们执行的任务时间很长,就可能造成上一个时间段触发的任务还没有执行完成,下一个任务又开始了,这样就会造成重入的问题。为了解决这个问题,我们用_IsRunning作为一个标志,表示上次的任务是否完成了,如果完成了,我们就执行新的任务,如果没完成就跳过这次的任务继续执行上次的任务。
具体的逻辑在下面这段代码中实现:
程序代码
privatevoidUpdateTimerCallback(objectsender)
{
if(Interlocked.Exchange(ref_IsRunning,1)==0)
{
try
{
//此处写你自己想执行的任务
}
catch(Exceptionex)
{
}
finally
{
Interlocked.Exchange(ref_IsRunning,0);
}
}
}
大家看到,上面代码中用到了Interlocked.Exchange这个方法。该方法的作用是保证多线程下给对象赋值的安全性。因为在多线程下,我们直接给_IsRunning赋值是不安全的,所以在这种情况下Interlocked.Exchange就派上了用场。
说完了ScheduledTask类的实现,下面我们看看如何在ASP.NET中调用这个类。
建议在Application_Start中调用这个类,代码如下:
程序代码
publicclassGlobal:System.Web.HttpApplication
{
protectedvoidApplication_Start(objectsender,EventArgse)
{
ScheduledTask.Instance().Start();
}
protectedvoidApplication_End(objectsender,EventArgse)
{
ScheduledTask.Instance().Stop();
}
}
OK,以上就是Timer在ASP.NET中的简单应用,如果有什么说的不对的地方,还请多多指教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
asp.net下实现可以将计划任务的方法放在global里,使用一个统一的任务管理类来管理各种任务的执行,做到并行不悖!下面是我写的一个方法,希望起个抛砖引玉的
本文实例讲述了asp.net中Timer无刷新定时器的实现方法。Timer控件要实现无刷新,得用到ajax技术,这里使用VS2008自带的ajax技术。首先得添
本文实例讲述了PHP模拟asp.net的StringBuilder类实现方法。分享给大家供大家参考。具体如下:在asp.net开发开发环境中,有一个String
本文实例讲述了ASP.NET实现基于Forms认证的WebService应用方法。分享给大家供大家参考。具体实现方法如下:在安全性要求不是很高的ASP.Net程
本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧。分享给大家供大家参考。具体实现