C# 生產消費模式
阿新 • • 發佈:2022-03-25
public class ProductionConsumptionHelper { public static readonly ProductionConsumptionHelper Instance = new ProductionConsumptionHelper(); private ProductionConsumptionHelper() { } // 任務佇列 ConcurrentQueue<WorkItem> _tasksList = newConcurrentQueue<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> privatevoid 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);
總結:一個地方把要做的事情插入到佇列裡,後臺啟一個執行緒把事情一條一條的給做了(場景:下載,上傳,儲存等)。