定时事件任务池

1.为什么要使用定时任务池?

任务池可以让我们将某些需要程序循环定时执行的一系列方法自动地执行,你只需要将想要定时执行的任务扔进任务池即可,而任务池则会自动并行地调用你想要执行的方法。

2.实现

首先我们任务池的生命周期是跟程序绑定的话,我们在开始设计的时候最好将其设计为一个静态类。

public static TaskPool
{
      private static int m_loopTime;
      private static List<CallBackFunc> m_taskPool;
      private Thread m_daemonThread;
      private bool m_running;
}

在上面我们声明了一些必须的变量,例如循环调用间隔,任务池列表,以及守护线程和运行状态。

public static class TimerPool
    {
        /// <summary>
        /// 回调委托
        /// </summary>
        public delegate void CallBackFunc();

        private static int m_loopTime;
        private static List<CallBackFunc> m_taskPool;
        private static Thread m_daemonThread;
        private static bool m_running;

        private static void CallFunction()
        {
            while(m_running)
            {
                Thread.Sleep(m_loopTime);
                Parallel.ForEach(m_taskPool, (item)=> { item(); });
            }
        }
        
        /// <summary>
        /// 添加一个新的定时任务
        /// </summary>
        /// <param name="func"></param>
        public static void AddFunc(CallBackFunc func)
        {
            m_taskPool.Add(func);
        }

        /// <summary>
        /// 清除所有定时任务
        /// </summary>
        public static void ClearAll()
        {
            m_taskPool.Clear();
        }

        /// <summary>
        /// 设置新的定时时间
        /// </summary>
        /// <param name="looptime">定时时间</param>
        public static void SetLoopTime(int looptime)
        {
            m_loopTime = looptime;
        }

        /// <summary>
        /// 停止任务池的运行
        /// </summary>
        public static void Stop()
        {
            m_running = false;
        }

        /// <summary>
        /// 开启任务轮询
        /// </summary>
        public static void Start()
        {
            m_running = true;
        }

        /// <summary>
        /// 初始化操作,5分钟的CD时间。
        /// </summary>
        static TimerPool()
        {
            m_dbSession = new DBSession();
            m_taskPool = new List<CallBackFunc>();
            m_running = true;
            m_loopTime = 60000 * 5;

            if(m_daemonThread == null)
            {
                m_daemonThread = new Thread(CallFunction);
                m_daemonThread.Start();
            }
        }
    }