在業(yè)務(wù)復(fù)雜的應(yīng)用程序中,有時(shí)候會(huì)要求一個(gè)或者多個(gè)任務(wù)在一定的時(shí)間或者一定的時(shí)間間隔內(nèi)計(jì)劃進(jìn)行,比如定時(shí)備份或同步數(shù)據(jù)庫,定時(shí)發(fā)送電子郵件等,我們稱之為計(jì)劃任務(wù)。實(shí)現(xiàn)計(jì)劃任務(wù)的方法也有很多,可以采用SQLAgent執(zhí)行存儲(chǔ)過程來實(shí)現(xiàn),也可以采用Windows任務(wù)調(diào)度程序來實(shí)現(xiàn),也可以使用Windows服務(wù)來完成我們的計(jì)劃任務(wù),這些方法都是很好的解決方案。但是,對(duì)于Web應(yīng)用程序來說,這些方法實(shí)現(xiàn)起來并不是很簡(jiǎn)單的,主機(jī)服務(wù)提供商或者不能直接提供這樣的服務(wù),或者需要你支付許多額外的費(fèi)用。 本文就介紹一個(gè)直接在Web應(yīng)用程序中使用的簡(jiǎn)單的方法,這個(gè)方法不需要任何額外的配置即可輕松實(shí)現(xiàn)。
由于ASP.NET站點(diǎn)是作為Web應(yīng)用程序運(yùn)行的,它并不受線程的限制,因此我們可以非常方便地在Application_Start和Application_End事件中建立和銷毀一個(gè)計(jì)劃任務(wù)。下面就簡(jiǎn)單介紹一下在Web站點(diǎn)實(shí)現(xiàn)計(jì)劃任務(wù)的方法。我們的例子是定時(shí)往文件里添加信息,作為例子,這里把當(dāng)前的時(shí)間定時(shí)地寫入文件中。
一個(gè)計(jì)劃任務(wù)的工作單元稱之為一個(gè)任務(wù)(Job),下面的代碼描述了對(duì)所有任務(wù)都可以被調(diào)度引擎計(jì)劃執(zhí)行的一個(gè)通用的接口,這里的每個(gè)任務(wù)實(shí)現(xiàn)了Execute方法,供調(diào)度引擎進(jìn)行調(diào)用:
代碼如下:
public interface ISchedulerJob
{
void Execute();
}
如前所述,我們的例子是實(shí)現(xiàn)往文件寫如字符日期,下面就是實(shí)現(xiàn)這一任務(wù)的方法:
代碼如下:
public class SampleJob : ISchedulerJob
{
public void Execute()
{
//文件保存的物理路徑,CSTest為虛擬目錄名稱,F(xiàn):/Inetpub/wwwroot/CSTest為物理路徑
string p = @"F:/Inetpub/wwwroot/CSTest";
//我們?cè)谔摂M目錄的根目錄下建立SchedulerJob文件夾,并設(shè)置權(quán)限為匿名可修改,
//SchedulerJob.txt就是我們所寫的文件
string FILE_NAME = p+ "http://SchedulerJob//SchedulerJob.txt";
//取得當(dāng)前服務(wù)器時(shí)間,并轉(zhuǎn)換成字符串
string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss");
//標(biāo)記是否是新建文件的標(biāo)量
bool flag = false;
//如果文件不存在,就新建該文件
if (!File.Exists(FILE_NAME))
{
flag = true;
StreamWriter sr = File.CreateText(FILE_NAME);
sr.Close();
}
//向文件寫入內(nèi)容
StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);
if(flag) x.Write("計(jì)劃任務(wù)測(cè)試開始:");
x.Write("/r/n"+c);
x.Close();
}
}
接下來,我們建立一個(gè)配置對(duì)象,告訴調(diào)度引擎執(zhí)行什么任務(wù)和執(zhí)行的時(shí)間間隔。
代碼如下:
public class SchedulerConfiguration
{
//時(shí)間間隔
private int sleepInterval;
//任務(wù)列表
private ArrayList jobs = new ArrayList();
public int SleepInterval { get { return sleepInterval; } }
新聞熱點(diǎn)
疑難解答
圖片精選