生產者 消費者 --- 多執行緒 到 單執行緒 控制
阿新 • • 發佈:2019-01-24
軟體在處理IO任務時,需要使用多執行緒,提高效率。 但在資源準備好了以後,需要使用單執行緒,來簡化控制邏輯,避免不必要的lock語句或原子程式碼。以下程式碼是C#中生產者消費者的一種變種使用方式,用於完成上訴任務。無守候執行緒,邏輯簡單::
/// <summary> /// 生產,消費者 控制程式碼 /// 生產者考慮為多執行緒. /// 消費者必須是單執行緒執行。 /// </summary> public class ProviderConsumer { uint syncID = 0; Action toCall; object m_lock = new object(); /// <summary> /// 有新的資源寫入,需要處理 /// </summary> public void NewResource() { syncID++; CheckRuning(); } /// <summary> /// 消費者函式註冊 /// </summary> /// <param name="callback"></param> public void RegistConsumer(Action callback) { if (toCall == null) toCall = callback; else throw new Exception("不能修改消費函式"); } void CheckRuning() { lock (m_lock) { if (toCall == null) return; //不使用阻塞變數,以銷燬執行緒。 Action f = DoFuncCall; f.BeginInvoke(null, null); } } void DoFuncCall() { Action Func = null; try { lock (m_lock) { if (this.toCall == null) return; Func = toCall; toCall = null; } uint syncIN = this.syncID - 1; while (syncID != syncIN) { syncIN = syncID; Func(); } } finally { if (Func != null) this.toCall = Func; } } }