zoukankan      html  css  js  c++  java
  • 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);//每小时执行一次

  • 相关阅读:
    ARM Linux异常处理之data abort(二)【转】
    ARM Linux异常处理之data abort(一)【转】
    arm的mmu学习【转】
    使用Squashfs和Overlayfs提高嵌入式Linux文件系统可靠性【转】
    【iView】100. iView踩坑集锦
    【AOP】【Publish-Event】AOP 切面编程 + Spring的publish-event 实现 监听者模式,实现补充业务逻辑开发
    【IDEA】idea打开新项目,左下角的工作栏中没有显示Services解决办法
    【java】ObjectOutputStream & ObjectInputStream 多次写入发生重复写入相同数据的问题
    【JS】时间工具类
    【MySQL】mysql优化集锦
  • 原文地址:https://www.cnblogs.com/hualiuliu/p/11457945.html
Copyright © 2011-2022 走看看