1、創建一個自動處理中心任務參數的類,直接源碼:
namespace Frame.AutoProcess
{
/// <summary>
/// 委托(用於異步處理任務)
/// </summary>
/// <param name="parameter">任務參數</param>
/// <returns>是否執行成功</returns>
public delegate bool TaskHandle(object parameter);
/// <summary>
/// 自動處理中心任務參數
/// </summary>
public class BackgroundTask
{
#region 私有成員
private bool _IsOnce = true; //是否執行一次
private bool _IsExecuteNow = false; //是否立即執行,對於重復執行生效
private int _Interval = 86400; //重復執行時的執行間隔,秒為單位,默認為一天,如果只執行一次並且想馬上執行將該值設置為0
private bool _IsAbortExcute = false; //終止執行(設置為true時,系統將不會執行Timer的事件)
private TaskHandle _ExecuteMethod = null; //任務執行方法
private object _Parameter = null; //任務執行方法參數
private DateTime? _ExecuteDateTime = null;
#endregion
#region 屬性
/// <summary>
/// 是否已經終止
/// </summary>
public bool IsAbortExcute
{
get { return this._IsAbortExcute; }
}
/// <summary>
/// 執行的方法
/// </summary>
public TaskHandle ExecuteMethod
{
get { return this._ExecuteMethod; }
}
#endregion
#region 構造函數
/// <summary>
/// 任務參數構造函數
/// </summary>
/// <param name="executeMethod">執行方法</param>
/// <param name="parameter">方法參數</param>
/// <param name="isOnce">是否執行一次</param>
/// <param name="interval">執行間隔(秒),默認為24小時</param>
/// <param name="isExecuteNow">是否立即執行</param>
/// <param name="executeDateTime"></param>
public BackgroundTask(TaskHandle executeMethod, object parameter = null, bool isOnce = true, int interval = 86400, bool isExecuteNow = false, DateTime? executeDateTime = null)
{
this._ExecuteMethod = executeMethod;
this._Parameter = parameter;
this._IsOnce = isOnce;
this._Interval = interval;
if (interval < 0)
{
this._Interval = 1;
}
this._IsExecuteNow = isExecuteNow;
this._ExecuteDateTime = executeDateTime;
}
#endregion
/// <summary>
/// 開始執行任務
/// </summary>
/// <returns></returns>
public void Execute()
{
if (!AutoProcessTask.IsStart) return;
int interval = _Interval * 1000;
if (interval == 0) interval = 1;
/*
Timer是提供以指定的時間間隔執行某方法的這樣一種機制,
* 即如果想要實現一個定時發送數據,比如每隔3s中發送一次心跳報文,或者執行某個指定的方法,
* 都可以考慮用Timer類來實現,
* 不過要提出的是Timer類一邊用來做一些比較簡單又不耗時間的操作。
* 據說是因為它執行的任務仍然在主線程里面
*/
if (this._ExecuteDateTime.HasValue) //按執行時間時每秒跑一次
interval = 1000;
Timer _timer = new Timer(interval);
_timer.AutoReset = !_IsOnce;
_timer.Enabled = true;
if (_IsExecuteNow && !_IsOnce) //立即執行
{
_ExecuteMethod.BeginInvoke(_Parameter, null, null);
}
_timer.Elapsed += new ElapsedEventHandler(Start);
if (_IsOnce && _timer != null)
{
_timer.Enabled = false;
_timer.Elapsed -= new ElapsedEventHandler(Start);
_timer = null;
}
}
/// <summary>
/// 開始執行Timer具體方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Start(object sender, ElapsedEventArgs e)
{
if (this._ExecuteDateTime.HasValue)
{
DateTime now = DateTime.Now;
DateTime executeTime = this._ExecuteDateTime.Value;
if (executeTime.Hour == now.Hour && executeTime.Minute == now.Minute && executeTime.Second == now.Second)
{
_ExecuteMethod.BeginInvoke(_Parameter, null, null);
}
else
{
(sender as Timer).Interval = 1000;
}
}
else
{
_ExecuteMethod.BeginInvoke(_Parameter, null, null);
}
}
}
}
2、定義自動處理任務的任務操作類,直接源碼:
namespace Frame.AutoProcess
{
/// <summary>
/// 自動處理任務
/// </summary>
public class AutoProcessTask
{
/// <summary>
/// 執行Execute方法后事件
/// </summary>
public static event EventHandler EventAfterExecute;
/// <summary>
/// 是否已經開始運行
/// </summary>
private static bool isStart = false;
/// <summary>
/// 任務列表
/// </summary>
private static List<BackgroundTask> taskList = new List<BackgroundTask>();
/// <summary>
/// 是否啟動
/// </summary>
public static bool IsStart
{
get { return isStart; }
}
/// <summary>
/// 添加任務
/// </summary>
/// <param name="task">任務對象</param>
public static void AddTask(BackgroundTask task)
{
if (task != null && isStart)
{
BackgroundTask tempTask = taskList.Where(O => O.ExecuteMethod == task.ExecuteMethod).FirstOrDefault();
if (tempTask != null) //系統已存在該任務
{
return;
}
taskList.Add(task); //添加到任務列表
task.Execute(); //開始執行任務
}
}
/// <summary>
/// 執行任務
/// </summary>
public static void Execute()
{
isStart = true;
if (EventAfterExecute != null)
{
EventAfterExecute(null, null);
}
}
}
}
3、調用方式,一般都是在工程啟動的時候添加如下直接源碼:
BackgroundTask extractAttachmentTextTask = new BackgroundTask((args) =>
{
string errMsg = string.Empty;
try
{
你的邏輯。。。。。。。。。。
}
catch
{ }
return true;
}, null, false, 3600, false);//每小時執行一次
