C#&.Net干貨分享-構建后台自動定時任務的源碼


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);//每小時執行一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM