一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

利用Timer在ASP.NET中實(shí)現(xiàn)計(jì)劃任務(wù)的方法

.NET Framework中為我們提供了3種類(lèi)型的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ù)的類(lèi):
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
{
//此處寫(xiě)你自己想執(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ù)又開(kāi)始了,這樣就會(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
{
//此處寫(xiě)你自己想執(zhí)行的任務(wù)
}
catch(Exception ex)

}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
大家看到,上面代碼中用到了Interlocked.Exchange這個(gè)方法。該方法的作用是保證多線程下給對(duì)象賦值的安全性。因?yàn)樵诙嗑€程下,我們直接給_IsRunning賦值是不安全的,所以在這種情況下Interlocked.Exchange就派上了用場(chǎng)。
說(shuō)完了ScheduledTask類(lèi)的實(shí)現(xiàn),下面我們看看如何在ASP.NET中調(diào)用這個(gè)類(lèi)。
建議在Application_Start中調(diào)用這個(gè)類(lèi),代碼如下:
 程序代碼
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)多多指教。

AspNet技術(shù)利用Timer在ASP.NET中實(shí)現(xiàn)計(jì)劃任務(wù)的方法,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 二区在线播放 | 天天做.天天爱.天天综合网 | 二区久久国产乱子伦免费精品 | 伊人手机在线视频 | 国产精品欧美在线不卡 | 婷婷伊人五月天 | 亚洲国产成人99精品激情在线 | 久久亚洲精品中文字幕二区 | 国产成人亚洲精品无广告 | 五月亭亭免费高清在线 | 国产男人女人做性全过程视频 | 国产麻豆麻豆 | 日韩欧美一二区 | 日日噜噜夜夜躁躁狠狠 | 亚洲欧美另类精品久久久 | 免费国产小视频 | www.黄在线| 午夜视频福利在线观看 | 亚洲影视一区二区 | 91视频最新网址 | 天天色图| 狠狠入 | 欧美人与禽交片在线播放 | 激情四房 | 欧美三级免费看 | 欧美日韩另类在线观看视频 | 一区二区三区免费视频网站 | 国产极品一区 | 91久久综合九色综合欧美98 | 国产亚洲精品一品区99热 | 色噜噜狠狠先锋影音久久 | 青青草伊人久久 | 影音先锋中文一区亚洲 | 久久有码中文字幕 | 手机看片自拍自拍自拍 | 在线观看成人小视频 | 国产乱理论片在线观看理论 | 日日摸夜夜添夜夜添毛片 | 高清不卡免费一区二区三区 | 思思久久这里只精品99re66 | 五月sese|