欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#队列Queue,利用队列处理订单

程序员文章站 2022-06-23 16:14:49
一、什么是队列 队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 这是摘抄网上的。做了个demo,但笔者技术有限,如有改进的地方,欢迎大神多多指导。 二、利用队列来处理订单问题 思路:开 ......

一、什么是队列

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

这是摘抄网上的。做了个demo,但笔者技术有限,如有改进的地方,欢迎大神多多指导。

二、利用队列来处理订单问题

 思路:开启一个线程去创建订单,同时处理订单线程开启,如队列里有订单,那么就处理,直到没有就一直处于等待状态(这里我等待20次就退出),等待订单加入队列再继续处理订单。

1、新建一个订单OrderInfo(用的是结构)

C#队列Queue,利用队列处理订单
    public struct OrderInfo
    {
        public int OrderId { get; set; }
        public int ProductId { get; set; }
        public Decimal Price { get; set; }
        public string Remarks { get; set; }
    }
View Code

2、到控制执行

C#队列Queue,利用队列处理订单
    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("订单处理完成,等待中。。。");
                        }
                    }
                }
            }

        }
    }
View Code

测试截图如下:

C#队列Queue,利用队列处理订单C#队列Queue,利用队列处理订单