1. 程式人生 > 實用技巧 >C#佇列Queue,利用佇列處理訂單

C#佇列Queue,利用佇列處理訂單

C#佇列Queue,利用佇列處理訂單

一、什麼是佇列

佇列(Queue)代表了一個先進先出的物件集合。當您需要對各項進行先進先出的訪問時,則使用佇列。當您在列表中新增一項,稱為入隊,當您從列表中移除一項時,稱為出隊。

二、利用佇列來處理訂單問題

思路:開啟一個執行緒去建立訂單,同時處理訂單執行緒開啟,如佇列裡有訂單,那麼就處理,直到沒有就一直處於等待狀態(這裡我等待20次就退出),等待訂單加入佇列再繼續處理訂單。

1、新建一個訂單OrderInfo(用的是結構)

    public struct OrderInfo
    {
        public int OrderId { get; set; }
        public int ProductId { get; set; }
        public Decimal Price { get; set; }
        public string Remarks { get; set; }
    }

2、到控制執行

    class Program
    {
        public static readonly Queue<OrderInfo> queue = new Queue<OrderInfo>();
        public static object obj = new object();
        static void Main(string[] args)
        {
            #region 模仿淘寶處理訂單問題
            //訂單進入佇列等待
            Task OrderTask = new Task(CreateOrder);
            OrderTask.Start();

            //開啟執行緒處理訂單
            Task taskDeal = new Task(DealOrder);
            taskDeal.Start();
            Console.WriteLine("hello");
            #endregion

            Console.ReadKey();
        }
        public static void CreateOrder()
        {
            for (int i = 1; i < 50; i++)
            {
                Thread.Sleep(300);
                lock (obj)
                {
                    OrderInfo order = new OrderInfo();
                    order.OrderId = i;
                    order.ProductId = 2800 + i;
                    order.Price = 888;
                    order.Remarks = "quick send goods";
                    queue.Enqueue(order);
                    Console.WriteLine("添加了一條訂單" + i);
                }
            }
        }

        public static int flag = 0;
        public static void DealOrder()
        {
            while (true)
            {
                Thread.Sleep(500);
                if (queue.Count > 0)
                {
                    lock (obj)
                    {
                        if (queue.Count > 0)
                        {
                            OrderInfo order = queue.Dequeue();
                            Console.WriteLine("處理==>訂單號{0};商品:{1}價格:{2}", order.OrderId, order.ProductId, order.Price);
                        }
                    }
                }
                else 
                {
                    Thread.Sleep(2000);
                    flag++;
                    if (flag > 10) { Console.WriteLine("All Over"); break; }
                    lock (obj)
                    {
                        if (queue.Count <= 0)
                        {
                            Console.WriteLine("訂單處理完成,等待中。。。");
                        }
                    }
                }
            }

        }
    }

測試截圖如下: