手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >利用Timer在ASP.NET中实现计划任务的方法
利用Timer在ASP.NET中实现计划任务的方法
摘要:.NETFramework中为我们提供了3种类型的Timer,分别是:ServerTimer(System.Timers.Timer),Th...

.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中的简单应用,如果有什么说的不对的地方,还请多多指教。

【利用Timer在ASP.NET中实现计划任务的方法】相关文章:

ASP.NET 运行.bat文件的实现方法

利用AJAX与数据岛实现无刷新绑定

在asp.net下实现Option条目中填充前导空格的方法

ASP.NET列出数据库活跃链接的方法

asp.net实现C#绘制太极图的方法

c#中实现文件拖放打开的方法

ASP.NET抓取网页内容的实现方法

在ASP.NET 中实现单点登录

ASP.NET防止页面刷新的两种解决方法

ASP.NET实现推送文件到浏览器的方法

精品推荐
分类导航