简单的线程工作队列

使用一个线程专门完成某种任务。

    /// <summary>
    /// 线程工作队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ThreadWorkQueue<T> where T : class
    {
        public Action<T> OnDequeue { get; set; }

        /// <summary>
        /// 开始线程,初始化线程
        /// </summary>
        public void Init()
        {
            _pQueue = new Queue<T>();
            _hasTask = new ManualResetEvent(false);

            _taskThread = new Thread(Process);
            _taskThread.IsBackground = true;
            _taskThread.Start();
        }

        /// <summary>
        ///  添加任务
        /// </summary>
        /// <param name="param"></param>
        public static void AddTask(T param)
        {
            _pQueue.Enqueue(param);
            //LogHelper.Info("-- 任务开始 Set Start--");
            _hasTask.Set();
        }

        /// <summary>
        /// 任务队列
        /// </summary>
        private static Queue<T> _pQueue;

        /// <summary>
        ///  用于通知是否有新数据要处理的“信号器”
        /// </summary>
        private static ManualResetEvent _hasTask;

        /// <summary>
        /// 用于处理任务的线程
        /// </summary>
        private static Thread _taskThread;

        /// <summary>
        /// 理队列中的任务
        /// </summary>
        private void Process()
        {
            while (true)
            {
                try
                {
                    // 等待接收信号,阻塞线程。
                    //LogHelper.Info("-- 任务开始 WaitOne Start--");
                    _hasTask.WaitOne();

                    var p = _pQueue.Dequeue();
                    OnDequeue(p);

                    if (_pQueue.Count < 1)
                    {
                        //LogHelper.Info("-- 任务中断 Reset Start--");
                        _hasTask.Reset();
                    }
                }
                catch (ThreadAbortException ex)
                {
                    //LogHelper.Error("主处理进程错误 ThreadAbortException", ex);
                    throw ex;
                }
                catch (Exception ex)
                {
                    //LogHelper.Error("主处理进程错误", ex);
                }
            }
        }

    }
ThreadWorkQueue

猜你喜欢

转载自www.cnblogs.com/tanl/p/12501915.html