摘要:[ASP.NET] 使用 Global 打造背景批次作業
前言
說到背景批次處理,一般的情況下我們可以使用Console專案配上Windows排程去處理,但是如果碰到需求更為簡單的時候去撰寫Console專案可能會覺得更麻煩,在這種情況下,我們可以使用 Global類別 來達成需求,請看以下範例。
範例
本範例主要動作為產生一個背景工作執行序,並且定時去寫入檔案內容,而前台只做存讀取該檔案內容。
Step 1
首先先建立一個背景工作類別,在以下程式碼中使用到 Timer類別 ,利用 Timer 可以固定時間去執行某一個方法,而背景要去執行的方法內容則是去寫入一個TXT文件檔,多加了Lock是為了避免同時間去讀取到該檔案,如下
using System;
using System.Collections.Generic;
using System.Web;
using System.Threading;
using System.IO;
public class BackgroundWork
{
public static object oLock = new object();
private static Timer timer;
// 開始背景作業
public void StartWork()
{
TimeSpan delayTime = new TimeSpan(0, 0, 5); // 應用程式起動後多久開始執行
TimeSpan intervalTime = new TimeSpan(0, 0, 2); // 應用程式起動後間隔多久重複執行
TimerCallback timerDelegate = new TimerCallback(BatchMethod); // 委派呼叫方法
timer = new Timer(timerDelegate, null, delayTime, intervalTime); // 產生 timer
}
// 背景批次方法
private void BatchMethod(object pStatus)
{
lock (oLock)
{
using (StreamWriter sw = new StreamWriter(
System.Web.Hosting.HostingEnvironment.MapPath("~/TimeLog.txt")))
{
sw.WriteLine(DateTime.Now);
System.Threading.Thread.Sleep(1000);
sw.WriteLine(DateTime.Now);
}
}
}
}
Step 2
在方按總管中點選「加入新項目」> 找到「全域應用程式類別(Global.asax)」加入專案內
接著在應用程式啟動時執行(Application_Start)方法中產生背景處理類別物件,並且執行StartWork方法,也就是利用Global類別的應用程式起動時去產生背景執行的物件,而背景執行物件就會產生一個 Timer 去定時執行
void Application_Start(object sender, EventArgs e)
{
// 應用程式啟動時執行的程式碼
// 啟動背景工作
BackgroundWork work = new BackgroundWork();
work.StartWork();
}
Step 3
當以上兩步驟都完成後就要來測試看看是否正確執行,建立一個ASPX頁面並放上一個按鈕加入以下程式碼去讀取文字檔的資料顯示
protected void Button1_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
lock (BackgroundWork.oLock)
{
// 讀取文字檔內容
using (StreamReader sr = new StreamReader(Server.MapPath("~/TimeLog.txt")))
{
while (sr.Peek() >= 0)
{
sb.AppendLine(sr.ReadLine() + "<BR />");
}
}
}
Label1.Text = sb.ToString();
}
最後可以來測試看看是否有在背景執行寫入,如下:
範例程式碼
參考資料
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)