C# 生產消費模式

    public class ProductionConsumptionHelper
    {
        public static readonly ProductionConsumptionHelper Instance = new ProductionConsumptionHelper();
        private ProductionConsumptionHelper()
        {
            
        }
        // 任務隊列
        ConcurrentQueue<WorkItem> _tasksList = new ConcurrentQueue<WorkItem>();
        readonly object _locker = new object();
        // 通過 _wh 給工作線程發信號 
        EventWaitHandle _wh = new AutoResetEvent(false);
        Thread _worker;

        private void Start()
        {
            if (_worker == null)
            {
                lock (_locker)
                {
                    if (_worker == null)
                    {
                        // 任務開始,啓動工作線程
                        _worker = new Thread(Work);
                        _worker.Start();
                    }
                }
            }

        }

        /// <summary>消費線程的工作</summary>
        private void Work()
        {
            while (true)
            {
                WorkItem witem = null;
                if (_tasksList.Count > 0)
                {
                    _tasksList.TryDequeue(out witem); // 有任務時,出列任務

                    if (witem == null)  // 退出機制:當遇見一個null任務時,代表任務結束
                        return;
                }
                if (witem != null)
                    DoAction(witem);  // 任務不爲null時,處理並保存數據
                else
                    _wh.WaitOne();   // 沒有任務了,等待信號
            }
        }

        /// <summary>插入任務</summary>
        public void EnqueueTask(List<WorkItem> tasklist)
        {
            if (_worker == null)
                Start();

            foreach (WorkItem witem in tasklist)
            {
                _tasksList.Enqueue(witem);  // 向隊列中插入任務
            }
            _wh.Set();  // 給工作線程發信號
        }

        /// <summary>結束釋放</summary>
        public void Dispose()
        {
            EnqueueTask(null);      // 插入一個Null任務,通知工作線程退出
            _worker.Join();         // 等待工作線程完成
            _wh.Close();            // 釋放資源
        }

        /// <summary>處理任務</summary>
        public void DoAction(WorkItem data)
        {
            //自己寫要做的事情。
            Console.WriteLine(data.Orderid);
            Thread.Sleep(3000); 
        }

    }
    public class WorkItem
    {
        public WorkItem(string _Orderid, string _ImageLoclFilePath, string _ImageOSSFilePath)
        {
            Orderid = _Orderid;
            ImageLoclFilePath = _ImageLoclFilePath;
            ImageOSSFilePath = _ImageOSSFilePath;

        }
        public string Orderid
        {
            get;
            set;
        }
        public string ImageLoclFilePath
        {
            get;
            set;
        }
        public string ImageOSSFilePath
        {
            get;
            set;
        }

    }

測試代碼:

   List<WorkItem> Orids = new List<WorkItem>() { };
            Orids.Add(new WorkItem("001", "", ""));
            Orids.Add(new WorkItem("002", "", ""));
            Orids.Add(new WorkItem("003", "", ""));
                ProductionConsumptionHelper.Instance.EnqueueTask(Orids);

總結:一個地方把要做的事情插入到隊列裏,後臺啓一個線程把事情一條一條的給做了(場景:下載,上傳,保存等)。

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章