[ASP.NET] 使用 Global 打造背景批次作業

摘要:[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();
}

 

最後可以來測試看看是否有在背景執行寫入,如下:

 

範例程式碼


TGlobalBatch.rar

 

參考資料


Global 類別

Timer 類別

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)