軟件中經常有定時執行的操作,比如銀行需要定時計算利息,客戶合同到期需要定時自動發送短信或者郵件提醒,這些如果通過人工操作是一個很大的任務量,不太切合實際,所以需要考慮讓系統自動完成操作,方法很多,比如數據庫的定時作業,window組件等都可以實現,在這里我們使用另外一種方式,C#線程來完成:
首先定義一個接口(ISchedulerJob),用來標准化事件的任務

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
/// ISchedulerJob 的摘要說明
/// </summary>
public interface ISchedulerJob
{
void Execute();
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
/// ISchedulerJob 的摘要說明
/// </summary>
public interface ISchedulerJob
{
void Execute();
}
然后定義任務類實現接口
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Text;
using System.Data.SqlClient;
using JH.BLL;
using JH.Model;
/// <summary>
/// SampleJob 的摘要說明
/// </summary>
public class SampleJob : ISchedulerJob
{
public SampleJob()
{
//
// TODO: 在此處添加構造函數邏輯
//
}
#region ISchedulerJob 成員
public void Execute()
{
string today = DateTime.Now.ToString( " MM-dd HH:mm:ss ");
try
{
// 獲取所有用戶
// 如果時間處在下面的四個時間點,將會執行定義的任務
if (today == " 03-20 00:20:00 " || today == " 06-20 00:20:00 " || today == " 09-20 00:20:00 " || today == " 12-20 00:20:00 ")
{
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Text;
using System.Data.SqlClient;
using JH.BLL;
using JH.Model;
/// <summary>
/// SampleJob 的摘要說明
/// </summary>
public class SampleJob : ISchedulerJob
{
public SampleJob()
{
//
// TODO: 在此處添加構造函數邏輯
//
}
#region ISchedulerJob 成員
public void Execute()
{
string today = DateTime.Now.ToString( " MM-dd HH:mm:ss ");
try
{
// 獲取所有用戶
// 如果時間處在下面的四個時間點,將會執行定義的任務
if (today == " 03-20 00:20:00 " || today == " 06-20 00:20:00 " || today == " 09-20 00:20:00 " || today == " 12-20 00:20:00 ")
{
//任務
}
}
}
}
}
}
}
catch (Exception ee)
{
throw new Exception(ee.Message);
}
}
#endregion
}
}
}
}
}
catch (Exception ee)
{
throw new Exception(ee.Message);
}
}
#endregion
}
如果有多個任務,可以多定義幾個
然后在一個類用來將任務整合到一起,並設其他要用到的參數
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
/// <summary>
/// SchedulerConfiguration 的摘要說明
/// </summary>
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;
}
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
/// <summary>
/// SchedulerConfiguration 的摘要說明
/// </summary>
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;
}
}
再次開始執行任務

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Threading;
/// <summary>
/// Scheduler 的摘要說明
/// </summary>
public class Scheduler
{
private SchedulerConfiguration configuration = null;
public Scheduler(SchedulerConfiguration config)
{
//
// TODO: 在此處添加構造函數邏輯
//
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);
}
}
}
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Threading;
/// <summary>
/// Scheduler 的摘要說明
/// </summary>
public class Scheduler
{
private SchedulerConfiguration configuration = null;
public Scheduler(SchedulerConfiguration config)
{
//
// TODO: 在此處添加構造函數邏輯
//
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
<%@ Application Language=
"
C#
" %>
<%@ Import Namespace= " System.Data " %>
<%@ Import Namespace= " JH.BLL " %>
<%@ Import Namespace= " JH.Model " %>
<%@ Import Namespace= " System.Data.SqlClient " %>
<%@ Import Namespace= " JH.Common " %>
<script runat= " server ">
public System.Threading.Thread schedulerThread = null;
void Application_Start( object sender, EventArgs e)
{
DateTime today = DateTime.Now;
SchedulerConfiguration config = new SchedulerConfiguration( 1000);
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();
// }
}
void Application_End( object sender, EventArgs e)
{
// 在應用程序關閉時,終止線程的進行
if ( null != schedulerThread)
{
schedulerThread.Abort();
}
}
void Application_Error( object sender, EventArgs e)
{
// 在出現未處理的錯誤時運行的代碼
}
void Session_Start( object sender, EventArgs e)
{
// 在新會話啟動時運行的代碼
}
void Session_End( object sender, EventArgs e)
{
// 在會話結束時運行的代碼。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式設置為
// InProc 時,才會引發 Session_End 事件。如果會話模式
// 設置為 StateServer 或 SQLServer,則不會引發該事件。
}
</script>
<%@ Import Namespace= " System.Data " %>
<%@ Import Namespace= " JH.BLL " %>
<%@ Import Namespace= " JH.Model " %>
<%@ Import Namespace= " System.Data.SqlClient " %>
<%@ Import Namespace= " JH.Common " %>
<script runat= " server ">
public System.Threading.Thread schedulerThread = null;
void Application_Start( object sender, EventArgs e)
{
DateTime today = DateTime.Now;
SchedulerConfiguration config = new SchedulerConfiguration( 1000);
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();
// }
}
void Application_End( object sender, EventArgs e)
{
// 在應用程序關閉時,終止線程的進行
if ( null != schedulerThread)
{
schedulerThread.Abort();
}
}
void Application_Error( object sender, EventArgs e)
{
// 在出現未處理的錯誤時運行的代碼
}
void Session_Start( object sender, EventArgs e)
{
// 在新會話啟動時運行的代碼
}
void Session_End( object sender, EventArgs e)
{
// 在會話結束時運行的代碼。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式設置為
// InProc 時,才會引發 Session_End 事件。如果會話模式
// 設置為 StateServer 或 SQLServer,則不會引發該事件。
}
</script>
這個時候,程序在1秒鍾就會自動通過線程去監聽,保證到定義的時間點去執行任務