利用Timer在ASP.NET中實(shí)現(xiàn)計(jì)劃任務(wù)的方法
更新時(shí)間:2007年04月13日 00:00:00 作者:
.NET Framework中為我們提供了3種類型的Timer,分別是:
Server Timer(System.Timers.Timer),Thread Timer(System.Threading.Timer )和Windows Timer(System.Windows.Forms.Timer)。
其中Windows Timer和WinAPI中的Timer一樣,是基于消息的,而且是單線程的。另外兩個(gè)Timer則不同于Windows Timer,它們是基于ThreadPool的,這樣最大的好處就是,產(chǎn)生的時(shí)間間隔準(zhǔn)確均勻。Server Timer和Thread Timer的區(qū)別在于,Server Timer是基于事件的,而Thread Timer是基于Callback的。
相比之下Thread Timer更輕量級(jí)一些,所以下文主要以Thread Timer為例,講解如何利用Thread Timer在ASP.NET中實(shí)現(xiàn)計(jì)劃任務(wù)。
下面給出一個(gè)用Timer實(shí)現(xiàn)計(jì)劃任務(wù)的類:
public class ScheduledTask
{
private static readonly ScheduledTask _ScheduledTask = null;
private Timer UpdateTimer = null;
//間隔時(shí)間,這里設(shè)置為15分鐘
private int Interval = 15 * 60000;
private int _IsRunning;
static ScheduledTask()
{
_ScheduledTask = new ScheduledTask();
}
public static ScheduledTask Instance()
{
return _ScheduledTask;
}
public void Start()
{
if(UpdateTimer == null)
{
UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, Interval, Interval);
}
}
private void UpdateTimerCallback(object sender)
{
if(Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//此處寫你自己想執(zhí)行的任務(wù)
}
catch(Exception ex)
{
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
public void Stop()
{
if(UpdateTimer != null)
{
UpdateTimer.Dispose();
UpdateTimer = null;
}
}
}
首先,注意一下這段:private int _IsRunning;
_IsRunning是一個(gè)標(biāo)志,它代表上一個(gè)時(shí)間間隔觸發(fā)的任務(wù)是否運(yùn)行完成。
為什么我們需要這個(gè)_IsRunning標(biāo)志呢?
因?yàn)?,如果我們?zhí)行的任務(wù)時(shí)間很長(zhǎng),就可能造成上一個(gè)時(shí)間段觸發(fā)的任務(wù)還沒(méi)有執(zhí)行完成,下一個(gè)任務(wù)又開始了,這樣就會(huì)造成重入的問(wèn)題。為了解決這個(gè)問(wèn)題,我們用_IsRunning作為一個(gè)標(biāo)志,表示上次的任務(wù)是否完成了,如果完成了,我們就執(zhí)行新的任務(wù),如果沒(méi)完成就跳過(guò)這次的任務(wù)繼續(xù)執(zhí)行上次的任務(wù)。
具體的邏輯在下面這段代碼中實(shí)現(xiàn):
程序代碼
private void UpdateTimerCallback(object sender)
{
if(Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//此處寫你自己想執(zhí)行的任務(wù)
}
catch(Exception ex)
{
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
大家看到,上面代碼中用到了Interlocked.Exchange這個(gè)方法。該方法的作用是保證多線程下給對(duì)象賦值的安全性。因?yàn)樵诙嗑€程下,我們直接給_IsRunning賦值是不安全的,所以在這種情況下Interlocked.Exchange就派上了用場(chǎng)。
說(shuō)完了ScheduledTask類的實(shí)現(xiàn),下面我們看看如何在ASP.NET中調(diào)用這個(gè)類。
建議在Application_Start中調(diào)用這個(gè)類,代碼如下:
程序代碼
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
ScheduledTask.Instance().Start();
}
protected void Application_End(object sender, EventArgs e)
{
ScheduledTask.Instance().Stop();
}
}
OK,以上就是Timer在ASP.NET中的簡(jiǎn)單應(yīng)用,如果有什么說(shuō)的不對(duì)的地方,還請(qǐng)多多指教。
Server Timer(System.Timers.Timer),Thread Timer(System.Threading.Timer )和Windows Timer(System.Windows.Forms.Timer)。
其中Windows Timer和WinAPI中的Timer一樣,是基于消息的,而且是單線程的。另外兩個(gè)Timer則不同于Windows Timer,它們是基于ThreadPool的,這樣最大的好處就是,產(chǎn)生的時(shí)間間隔準(zhǔn)確均勻。Server Timer和Thread Timer的區(qū)別在于,Server Timer是基于事件的,而Thread Timer是基于Callback的。
相比之下Thread Timer更輕量級(jí)一些,所以下文主要以Thread Timer為例,講解如何利用Thread Timer在ASP.NET中實(shí)現(xiàn)計(jì)劃任務(wù)。
下面給出一個(gè)用Timer實(shí)現(xiàn)計(jì)劃任務(wù)的類:
public class ScheduledTask
{
private static readonly ScheduledTask _ScheduledTask = null;
private Timer UpdateTimer = null;
//間隔時(shí)間,這里設(shè)置為15分鐘
private int Interval = 15 * 60000;
private int _IsRunning;
static ScheduledTask()
{
_ScheduledTask = new ScheduledTask();
}
public static ScheduledTask Instance()
{
return _ScheduledTask;
}
public void Start()
{
if(UpdateTimer == null)
{
UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, Interval, Interval);
}
}
private void UpdateTimerCallback(object sender)
{
if(Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//此處寫你自己想執(zhí)行的任務(wù)
}
catch(Exception ex)
{
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
public void Stop()
{
if(UpdateTimer != null)
{
UpdateTimer.Dispose();
UpdateTimer = null;
}
}
}
首先,注意一下這段:private int _IsRunning;
_IsRunning是一個(gè)標(biāo)志,它代表上一個(gè)時(shí)間間隔觸發(fā)的任務(wù)是否運(yùn)行完成。
為什么我們需要這個(gè)_IsRunning標(biāo)志呢?
因?yàn)?,如果我們?zhí)行的任務(wù)時(shí)間很長(zhǎng),就可能造成上一個(gè)時(shí)間段觸發(fā)的任務(wù)還沒(méi)有執(zhí)行完成,下一個(gè)任務(wù)又開始了,這樣就會(huì)造成重入的問(wèn)題。為了解決這個(gè)問(wèn)題,我們用_IsRunning作為一個(gè)標(biāo)志,表示上次的任務(wù)是否完成了,如果完成了,我們就執(zhí)行新的任務(wù),如果沒(méi)完成就跳過(guò)這次的任務(wù)繼續(xù)執(zhí)行上次的任務(wù)。
具體的邏輯在下面這段代碼中實(shí)現(xiàn):
程序代碼
private void UpdateTimerCallback(object sender)
{
if(Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//此處寫你自己想執(zhí)行的任務(wù)
}
catch(Exception ex)
{
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
大家看到,上面代碼中用到了Interlocked.Exchange這個(gè)方法。該方法的作用是保證多線程下給對(duì)象賦值的安全性。因?yàn)樵诙嗑€程下,我們直接給_IsRunning賦值是不安全的,所以在這種情況下Interlocked.Exchange就派上了用場(chǎng)。
說(shuō)完了ScheduledTask類的實(shí)現(xiàn),下面我們看看如何在ASP.NET中調(diào)用這個(gè)類。
建議在Application_Start中調(diào)用這個(gè)類,代碼如下:
程序代碼
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
ScheduledTask.Instance().Start();
}
protected void Application_End(object sender, EventArgs e)
{
ScheduledTask.Instance().Stop();
}
}
OK,以上就是Timer在ASP.NET中的簡(jiǎn)單應(yīng)用,如果有什么說(shuō)的不對(duì)的地方,還請(qǐng)多多指教。
您可能感興趣的文章:
- Asp.Net(C#)自動(dòng)執(zhí)行計(jì)劃任務(wù)的程序?qū)嵗治龇窒?/a>
- asp.net 在客戶端顯示服務(wù)器端任務(wù)處理進(jìn)度條的探討
- asp.net 定時(shí)間點(diǎn)執(zhí)行任務(wù)的簡(jiǎn)易解決辦法
- asp.net 每天定點(diǎn)執(zhí)行任務(wù)
- asp.net 計(jì)劃任務(wù)管理程序?qū)崿F(xiàn),多線程任務(wù)加載
- C#(asp.net)多線程用法示例(可用于同時(shí)處理多個(gè)任務(wù))
- ASP.NET 計(jì)劃任務(wù)實(shí)現(xiàn)方法(不使用外接程序,.net內(nèi)部機(jī)制實(shí)現(xiàn))
- 詳解免費(fèi)開源的DotNet任務(wù)調(diào)度組件Quartz.NET(.NET組件介紹之五)
- Asp.net ajax實(shí)現(xiàn)任務(wù)提示頁(yè)面的簡(jiǎn)單代碼
- .NET Core基于Generic Host實(shí)現(xiàn)后臺(tái)任務(wù)方法教程
相關(guān)文章
asp.net 通過(guò)httpModule計(jì)算頁(yè)面的執(zhí)行時(shí)間
有時(shí)候我們想檢測(cè)一下網(wǎng)頁(yè)的執(zhí)行效率。記錄下開始請(qǐng)求時(shí)的時(shí)間和頁(yè)面執(zhí)行完畢后的時(shí)間點(diǎn),這段時(shí)間差就是頁(yè)面的執(zhí)行時(shí)間了。要實(shí)現(xiàn)這個(gè)功能,通過(guò)HttpModule來(lái)實(shí)現(xiàn)是最方便而且準(zhǔn)確的。2011-02-02linq to sql中,如何解決多條件查詢問(wèn)題,答案,用表達(dá)式樹!
有個(gè)小項(xiàng)目中,用到了linq to sql,既然這樣,想必需要做多條件組合查詢了,雖然我對(duì)表達(dá)式樹的研究也只是寥寥地,但除此方法,似乎別無(wú)他法,只好硬著頭皮研究一下.2011-08-08Json數(shù)據(jù)轉(zhuǎn)換list對(duì)象實(shí)現(xiàn)思路及代碼
本文為大家詳細(xì)介紹下Json數(shù)據(jù)轉(zhuǎn)換list對(duì)象的具體實(shí)現(xiàn),感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-04-04.net core 基于Hangfire+Mysql持久化實(shí)現(xiàn)定時(shí)任務(wù)配置方法
這篇文章主要介紹了.net core 基于Hangfire+Mysql持久化實(shí)現(xiàn)定時(shí)任務(wù)配置方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07IIS7中ASP.net 請(qǐng)求處理過(guò)程說(shuō)明
IIS7 站點(diǎn)啟動(dòng)并處理請(qǐng)求的步驟如下,在iis7中處理asp.net的朋友可以參考下。2011-02-02XslTransform.Transform將結(jié)果輸出到字符串里的方法
XslTransform.Transform將結(jié)果輸出到字符串里的方法...2007-04-04