在Web應用程式中執行計劃任務(多執行緒) (轉)

amyz發表於2007-11-25
在Web應用程式中執行計劃任務(多執行緒) (轉)[@more@]在應用中計劃任務(多執行緒) 作者: 孟憲會 出自: .sz.luohuedu/">【孟憲會之精彩世界】 釋出日期: -8-26 23:41:13

在業務複雜的應用程式中,有時候會要求一個或者多個任務在一定的時間或者一定的時間間隔內計劃進行,比如定時或同步,定時傳送電子等,我們稱之為計劃任務。實現計劃任務的方法也有很多,可以採用Agent執行過程來實現,也可以採用任務排程程式來實現,也可以使用Windows服務來完成我們的計劃任務,這些方法都是很好的解決方案。但是,對於Web應用程式來說,這些方法實現起來並不是很簡單的,主機服務提供商或者不能直接提供這樣的服務,或者需要你支付許多額外的費用。 本文就介紹一個直接在Web應用程式中使用的簡單的方法,這個方法不需要任何額外的即可輕鬆實現。

由於.NET站點是作為Web應用程式執行的,它並不受執行緒的限制,因此我們可以非常方便地在Application_Start和Application_End事件中建立和銷燬一個計劃任務。下面就簡單介紹一下在Web站點實現計劃任務的方法。我們的例子是定時往裡新增資訊,作為例子,這裡把當前的時間定時地寫入檔案中。

一個計劃任務的工作單元稱之為一個任務(Job),下面的程式碼描述了對所有任務都可以被排程引擎計劃執行的一個通用的介面,這裡的每個任務實現了Execute方法,供排程引擎進行:

public interface ISchedulerJob { void Execute(); }

如前所述,我們的例子是實現往檔案寫如字元日期,下面就是實現這一任務的方法:

public class SampleJob : ISchedulerJob { public void Execute() { //檔案儲存的物理路徑,CSTest為虛擬目錄名稱,F:InetpubwwwCSTest為物理路徑 string p = @"F:InetpubwwwrootCSTest"; //我們在虛擬目錄的根目錄下建立SchedulerJob資料夾,並設定為匿名可修改, //SchedulerJob.txt就是我們所寫的檔案 string FILE_NAME = p+ "SchedulerJobSchedulerJob.txt"; //取得當前時間,並轉換成字串 string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss"); //標記是否是新建檔案的標量 bool flag = false; //如果檔案不存在,就新建該檔案 if (!File.Exists(FILE_NAME)) { flag = true; StreamWriter sr = File.CreateText(FILE_NAME); sr.Close(); } //向檔案寫入內容 StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default); if(flag) x.Write("計劃任務測試開始:"); x.Write("rn"+c); x.Close(); } }

接下來,我們建立一個配置,告訴排程引擎執行什麼任務和執行的時間間隔。

public class SchedulerConfiguration { //時間間隔 private int sleepInterval; //任務列表 private ArrayList jobs = new ArrayList(); public int SleepInterval { get { return sleepInterval; } } public ArrayList Jobs { get { return jobs; } } //排程配置類的構造 public SchedulerConfiguration(int newSleepInterval) { sleepInterval = newSleepInterval; } }

下面就是排程引擎,定時執行配置物件的任務

public class Scheduler { private SchedulerConfiguration configuration = null; public Scheduler(SchedulerConfiguration config) { configuration = config; } public void Start() { while(true) { //執行每一個任務 foreach(ISchedulerJob job in configuration.Jobs) { ThreadStart myThreadDelegate = new ThreadStart(job.Execute); Thread myThread = new Thread(myThreadDelegate); myThread.Start(); Thread.Sleep(configuration.SleepInterval); } } } }

所有的準備工作已經完成,下面就是啟用引擎的工作了。為了讓我們的任務計劃執行,我們在Global.asax.cs檔案裡的Applicatio_Start和Application_End裡進行建立和銷燬工作,首先建立一個排程程式執行的執行緒,我們這裡的執行間隔時間為3秒鐘。

public System.Threading.Thread schedulerThread = null; protected void Application_Start( sender, EventArgs e) { SchedulerConfiguration config = new SchedulerConfiguration(1000*3); config.Jobs.Add(new SampleJob()); Scheduler scheduler = new Scheduler(config); System.Threading.ThreadStart myThreadStart = new System.Threading.ThreadStart(scheduler.Start); System.Threading.Thread schedulerThread = new System.Threading.Thread(myThreadStart); schedulerThread.Start(); }

最後還需要在程式退出時進行銷燬:

protected void Application_End(Object sender, EventArgs e) { if (null != schedulerThread) { schedulerThread.Abort(); } }

好了,在VS.NET裡建立一個的Web應用程式工程,建立TaskScheduler.cs類,並修改相應的Global.asax.cs檔案。為了能看到效果,我們再建立一個表單WebForm1.,定時重新整理來檢查我們所記錄的資料:

w3c//DTD HTML 4.0 Transitional//EN&quot; &gt; <title>在Web應用程式中執行計劃任務的例子</title> <meta http-equiv="refresh" content="http://blog.itpub.net/10752019/viewspace-984556/10"> <meta name="GENERATOR" content="a href=" tag-126-1.html="">microsoft 7.0&quot;&gt; <meta name="CODE_LANGUAGE" content="C#"> <meta name="vs_defaultClientScript" content="a href=" tag-133-1.html="">script&quot;&gt; <meta name="vs_targetSchema" content=" href=" tag-340-1.html="">intellisense/&quot;&gt; <fo href="http://blog.itpub.net/10752019/viewspace-984556/tag-415-1.html">RM id=&quot;Form1&quot; method=&quot;post&quot; runat=&quot;server&quot;&gt; <iframe style="100%;height:100%" src="http://blog.itpub.net/10752019/viewspace-984556/SchedulerJob/SchedulerJob.txt"></iframe> </fo>

對工程進行編譯並執行,就可以看到結果了,結果如下:

計劃任務測試開始: 2003-13-10 11:08:15 2003-13-10 11:08:18 2003-13-10 11:08:21 2003-13-10 11:08:24 2003-13-10 11:08:27 2003-13-10 11:08:30

需要說明的是,以上只是在Web應用程式中執行計劃任務的簡單例子,對於多個任務來說,需要在不同的執行緒內進行工作,對計劃的安排也是很簡單的,實際還需要站點堵塞,當機的情況。另外這裡也沒有進行錯誤的處理等工作,相信大家會寫出更加完美的程式碼的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984556/,如需轉載,請註明出處,否則將追究法律責任。

相關文章