用C#实现的一个简单任务机,解决了一般任务机无法定时执行任务的问题

// 自己写的一个任务机,相比一般的任务机的有点,此任务机可以定时执行任务。注释已很明确,不多解释了
    /// <summary>
    /// 任务机
    /// </summary>
    public class TaskRunner
    {
        /// <summary>
        /// 任务执行完之后的回调方法类型
        /// </summary>
        /// <param name="arg0">使用LoadTask添加任务时传入的arg0</param>
        /// <param name="arg1">使用LoadTask添加任务时传入的arg1</param>
        /// <param name="arg2">使用LoadTask添加任务时传入的arg2</param>
        /// <returns></returns>
        public delegate int Handler(int arg0, object arg1, byte[] arg2);

        /// <summary>
        /// 任务描述
        /// </summary>
	    struct TaskInfo
        {
            /// <summary>
            /// 任务唯一id
            /// </summary>
            static int _id_ = 1;

            public TaskInfo(int iType, Handler handler, int arg0, object arg1, byte[] arg2, long tmOffset = 0)
		    {
                this.id = _id_++;
                this.iType = iType;
                this.handler = handler;
			    this.arg0 = arg0;
			    this.arg1 = arg1;
                this.arg2 = arg2;
			    this.trigTick = DateTime.Now.AddMilliseconds(tmOffset).Ticks;
		    }
		    public int id;
            public int iType;
            public Handler handler;
		    public int arg0;
		    public object arg1;
            public byte[] arg2;
            public long trigTick; // 任务执行时机,只有在此值大于或等于当前时间时,任务才会被触发
	    }

        private List<TaskInfo> m_lsTask = null; // 储存任务的list
        private bool m_bStop = true;
        private Thread m_ThreadRunner = null; // 用于执行任务的线程

        public TaskRunner()
        {
            m_lsTask = new List<TaskInfo>();
        }

        /// <summary>
        /// 添加任务
        /// </summary>
        /// <param name="iType">任务类型,由用户自定义,若不对任务分类则传0</param>
        /// <param name="handler">任务回调</param>
        /// <param name="arg0">用户定义参数</param>
        /// <param name="arg1">用户定义参数</param>
        /// <param name="arg2">用户定义参数</param>
        /// <param name="tmOffset">任务执行时机,一个相对于当前时间的偏移值,单位毫秒</param>
        /// <returns>返回任务id</returns>
        public int LoadTask(int iType, Handler handler, int arg0, object arg1, byte[] arg2, long tmOffset = 0)
        {
            TaskInfo ti = new TaskInfo(iType, handler, arg0, arg1, arg2, tmOffset);
            lock (m_lsTask)
            {
                m_lsTask.Add(ti);
            }
            return ti.id;
        }

        /// <summary>
        /// 卸载任务,若id<1则根据iType卸载,若id>0则根据id卸载并忽略iType
        /// </summary>
        /// <param name="id">任务id,从LoadTask的返回值获取</param>
        /// <param name="iType">任务类型,由用户自定义,必须大于0</param>
        /// <returns>返回成功卸载的任务个数</returns>
        public int UnloadTask(int id, int iType)
        {
            int iCount = 0;
            lock (m_lsTask)
            {
                for (int i = 0; i < m_lsTask.Count;i++ )
                {
                    if (id < 1)
                    {
                        if (m_lsTask[i].iType == iType)
                        {
                            m_lsTask.RemoveAt(i);
                            iCount++;
                            i = -1;
                        }
                    }
                    else if (m_lsTask[i].id == id)
                    {
                        m_lsTask.RemoveAt(i);
                        iCount++;
                        break;
                    }
                }
            }
            return iCount;
        }

        /// <summary>
        /// 执行任务的线程
        /// </summary>
        void ThreadRunner()
        {
            m_lsTask.Clear();
            while (!m_bStop)
            {
                Thread.Sleep(50);

                TaskInfo? taskInfo = null;
                lock (m_lsTask)
                {
                    foreach (TaskInfo item in m_lsTask)
                    {
                        if (item.trigTick < DateTime.Now.Ticks)
                        {
                            taskInfo = item;
                            m_lsTask.Remove(item);
                            break;
                        }
                    }
                }
                if (taskInfo != null)
                {
                    taskInfo.Value.handler(taskInfo.Value.arg0, taskInfo.Value.arg1, taskInfo.Value.arg2);
                }
            }
            m_lsTask.Clear();
        }

        /// <summary>
        /// 开始任务机
        /// </summary>
        internal void Start()
        {
            m_bStop = false;
            m_ThreadRunner = new Thread(new ThreadStart(ThreadRunner));
            m_ThreadRunner.Start();
        }

        /// <summary>
        /// 停止任务机
        /// </summary>
        internal void Stop()
        {
            m_bStop = true;
            m_ThreadRunner.Join(3000);
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xktesla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值