一、什麼是隊列 隊列(Queue)代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時,則使用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。 這是摘抄網上的。做了個demo,但筆者技術有限,如有改進的地方,歡迎大神多多指導。 二、利用隊列來處理訂單問題 思路:開 ...
一、什麼是隊列
隊列(Queue)代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時,則使用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。
這是摘抄網上的。做了個demo,但筆者技術有限,如有改進的地方,歡迎大神多多指導。
二、利用隊列來處理訂單問題
思路:開啟一個線程去創建訂單,同時處理訂單線程開啟,如隊列里有訂單,那麼就處理,直到沒有就一直處於等待狀態(這裡我等待20次就退出),等待訂單加入隊列再繼續處理訂單。
1、新建一個訂單OrderInfo(用的是結構)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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、到控制執行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
測試截圖如下:
![](https://images2018.cnblogs.com/blog/1132529/201803/1132529-20180328135417890-1628579208.png)
![](https://images2018.cnblogs.com/blog/1132529/201803/1132529-20180328135538158-388967909.png)