標籤:style http 使用 os strong io 資料 for
一、關於本文
本文中實現的PCHelper類是一個簡易的Producer-Consumer操作工具類。該類可以實現如下目標:由多個線程向其中的一個Queue中寫入資料,同時由多個線程負責接收Queue中資料進行處理。
二、工具類代碼
/// <summary>/// Producer-Consumer操作類/// </summary>public class PCHelper{ readonly object listlock = new object(); //線程鎖 System.Collections.Queue queue = new System.Collections.Queue(); //隊列 /// <summary> /// 隊列名稱:用於標識一個隊列 /// </summary> private string _queuename; /// <summary> /// 隊列名稱:用於標識一個隊列 /// </summary> public string QueueName { get { return _queuename; } private set { _queuename = value; } } /// <summary> /// 隊列閾值:隊列長度超過閾值後會扔出異常 /// </summary> public uint _threshold; /// <summary> /// 隊列閾值:隊列長度超過閾值後會扔出異常 /// </summary> public uint Threshold { get { return _threshold; } private set { _threshold = value; } } /// <summary> /// Producer-Consumer操作類 /// </summary> /// <param name="queuename">隊列名</param> /// <param name="threshold">隊列資料量閾值:超過此閾值會產生異常</param> public PCHelper(string queuename = "",uint threshold = 300) { QueueName = queuename; Threshold = threshold; } /// <summary> /// 生產者函數:向隊列中添加一條資料 /// </summary> /// <param name="o"></param> public void Produce(object o) { lock (listlock) { if (queue.Count < Threshold ) { queue.Enqueue(o); System.Threading.Monitor.Pulse(listlock); } else { throw new Exception("隊列長度過長,入隊失敗"); } } } /// <summary> /// 消費者函數:從隊列中取出資料 /// </summary> /// <returns>從隊列中取出的第一個資料</returns> public object Consume() { lock (listlock) { while (queue.Count == 0) { System.Threading.Monitor.Wait(listlock); } } return queue.Dequeue(); } /// <summary> /// 清空資料 /// </summary> public void ClearData() { lock (listlock) { queue.Clear(); } } /// <summary> /// 隊列中資料數量 /// </summary> /// <returns></returns> public int DataCount() { int c; lock (listlock) { c = queue.Count; } return c; } /// <summary> /// 隊列中資料類型 /// </summary> /// <returns></returns> public Type DataType() { Type t; lock (listlock) { t = queue.GetType(); } return t; }}
三、測試代碼
Program中有Main函數及Main函數需要調用的相關函數。
ProduceLoop函數用於不斷向隊列queue中寫入資料。
ConsumeLoop函數用於不斷從隊列queue中取出資料。
本段代碼中CosumeLoop每次迴圈的時間間隔被設定要長於ProduceLoop5倍。
因此,當隊列到達設定的閾值(本段代碼中使用了預設值:300)時,工具類會報出相關異常。
class Program{ static PCHelper queue; static int i; static void Main(string[] args) { queue = new PCHelper("QueueTest"); i = 0; (new System.Threading.Thread(ProduceLoop)).Start(10); (new System.Threading.Thread(ConsumeLoop)).Start(50); Console.ReadLine(); } /// <summary> /// 不斷向隊列中插入資料 /// </summary> public static void ProduceLoop(object sleeptime) { while (true) { queue.Produce(i); Console.WriteLine(string.Format( "Produce: {0} DataLeft: {1}", i, queue.DataCount())); i++; System.Threading.Thread.Sleep(int.Parse(sleeptime.ToString())); } } /// <summary> /// 不斷從隊列中取出資料 /// </summary> public static void ConsumeLoop(object sleeptime) { while (true) { string temp = queue.Consume().ToString(); Console.WriteLine(string.Format( "Consume: {0} DataLeft: {1}", temp, queue.DataCount())); System.Threading.Thread.Sleep(int.Parse(sleeptime.ToString())); } }}
四、測試結果
END