C# 一個簡易的Producer-Consumer工具類

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.