独立线程的任务队列

来源:互联网 发布:数控铣床编程简单实例 编辑:程序博客网 时间:2024/06/02 06:52

因为正在写一个设备通信的程序,里面各个模块都是独立线程的任务队列模式,所以抽取了一个基类以便代码的复用。


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace TaskQueue{    /// <summary>    /// 独立线程任务队列基类    /// </summary>    /// <typeparam name="T">任务类型</typeparam>    public abstract class TaskQueue<T>    {        protected bool isStopped;        protected Thread workThread;        protected Queue<T> taskQueue = new Queue<T>();        protected int waitTime = 500;        public int WaitTime { get { return waitTime; } set { waitTime = value; } }        public void Start()        {            if (workThread != null && workThread.IsAlive) return;            isStopped = false;            workThread = new Thread(new ThreadStart(run));            workThread.Start();        }        public void Stop() { isStopped = true; }        public void AddTask(T task) { taskQueue.Enqueue(task); }        protected void run()        {            while (true)            {                if (taskQueue.Count == 0)                {                    if (isStopped) break;                    AddTask(getNewStartTask());                    Thread.Sleep(waitTime);                    continue;                }                T task = taskQueue.Dequeue();                executeTask(task);            }        }        protected abstract void executeTask(T task);        protected abstract T getNewStartTask();    }}


代码很少,但是使用起来很方便,只需要实现两个抽象方法就可以了。


namespace TaskQueue{    class Example : TaskQueue<string>    {        protected override void executeTask(string task)        {            //执行单个任务            if (task == null) return;            //your code here        }        protected override string getNewStartTask()        {            //该方法是在任务队列为空时调用的            //如果想让该任务队列自动发起任务(比如被动的轮询)则在此方法中返回一个起始任务            return null;        }    }}

启动线程调用Start方法

停止线程调用Stop方法

添加任务调用AddTask方法

设置无任务时的等待时间WaitTime,默认500ms

0 0
原创粉丝点击