C# 中的 Queue 是一種基於鏈表的先進先出 (FIFO) 數據結構。以下是一個簡單的 Queue 實例: /// <summary> /// 普通隊列 /// </summary> public void QueueShow() { // 創建一個Queue Queue<string> que ...
C# 中的 Queue
是一種基於鏈表的先進先出 (FIFO) 數據結構。以下是一個簡單的 Queue
實例:
/// <summary> /// 普通隊列 /// </summary> public void QueueShow() { // 創建一個Queue Queue<string> queue = new Queue<string>(); // 添加元素到隊列中 queue.Enqueue("Apple"); queue.Enqueue("Banana"); queue.Enqueue("Orange"); // 獲取隊列中的元素數量 int count = queue.Count; Console.WriteLine("隊列中的元素數量: " + count); // 檢查隊列是否為空 bool isEmpty = queue.Count == 0; Console.WriteLine("隊列是否為空: " + isEmpty); // 訪問隊列中的第一個元素(不移除) string firstElement = queue.Peek(); Console.WriteLine("隊列中的第一個元素: " + firstElement); // 移除並返回隊列中的第一個元素 string removedElement = queue.Dequeue(); Console.WriteLine("被移除的元素: " + removedElement); // 遍歷隊列中的所有元素 Console.WriteLine("剩餘的元素:"); foreach (var element in queue) { Console.WriteLine(element); } }
這個示例展示瞭如何使用C#中的Queue類。首先,我們創建了一個空的Queue對象。然後,使用Enqueue方法將元素添加到隊列中。可以使用Count屬性獲取隊列中的元素數量,並使用Peek方法訪問隊列中的第一個元素(但不移除)。使用Dequeue方法可以移除並返回隊列中的第一個元素。最後,可以使用foreach迴圈遍歷隊列中的所有元素。
ConcurrentQueue<T>
是 .NET 中一個非常有用的類,它用於在多線程環境中安全地處理隊列。下麵是一個 ConcurrentQueue<T>
的基本示例:
/// <summary> /// 線程安全隊列 /// </summary> public void ConcurrentQueueShow() { // 創建一個ConcurrentQueue ConcurrentQueue<string> queue = new ConcurrentQueue<string>(); // 添加元素到隊列中 queue.Enqueue("Apple"); queue.Enqueue("Banana"); queue.Enqueue("Orange"); // 獲取隊列中的元素數量 int count = queue.Count; Console.WriteLine("隊列中的元素數量: " + count); // 檢查隊列是否為空 bool isEmpty = queue.IsEmpty; Console.WriteLine("隊列是否為空: " + isEmpty); // 嘗試訪問隊列中的第一個元素(不移除) string firstElement; bool peekResult = queue.TryPeek(out firstElement); if (peekResult) { Console.WriteLine("隊列中的第一個元素: " + firstElement); } else { Console.WriteLine("隊列為空,無法訪問第一個元素。"); } // 嘗試移除並返回隊列中的第一個元素 string removedElement; bool dequeueResult = queue.TryDequeue(out removedElement); if (dequeueResult) { Console.WriteLine("被移除的元素: " + removedElement); } else { Console.WriteLine("隊列為空,無法移除元素。"); } // 遍歷隊列中的所有元素 Console.WriteLine("剩餘的元素:"); foreach (var element in queue) { Console.WriteLine(element); } }
這個示例展示瞭如何使用C#中的ConcurrentQueue類。ConcurrentQueue是線程安全的隊列,可以在多線程環境中進行併發訪問。與普通的Queue類不同,ConcurrentQueue類沒有Count屬性,而是提供了IsEmpty屬性來檢查隊列是否為空。ConcurrentQueue還提供了TryPeek和TryDequeue方法,用於嘗試訪問和移除隊列中的元素,如果操作成功,則返回true,並將結果存儲在輸出參數中;如果隊列為空,則返回false。可以使用foreach迴圈遍歷ConcurrentQueue中的所有元素。請註意,在多線程環境中使用ConcurrentQueue時要小心處理競態條件和線程安全性。
解決如果多個線程同時操作一個隊列推薦使用安全隊列,因為有可能引起添加隊列前數據都是正常的,當出隊時數據是null的情況。
/// <summary> /// 線程安全隊列 /// 如果多個線程同時操作一個隊列推薦使用安全隊列,因為有可能引起添加隊列前數據都是正常的,當出隊時數據是null的情況。 /// </summary> public void ConcurrentQueueShow2() { // 創建一個 ConcurrentQueue 實例 ConcurrentQueue<int> queue = new ConcurrentQueue<int>(); // 啟動一個任務來向隊列中添加元素 Task.Run(() => { for (int i = 0; i < 1000; i++) { queue.Enqueue(i); Task.Delay(10).Wait(); // 延遲10ms以模擬實際操作 } }); // 啟動另一個任務來從隊列中取出元素 Task.Run(() => { while (true) { int dequeue; if (queue.TryDequeue(out dequeue)) { Console.WriteLine("Dequeued: " + dequeue); } Task.Delay(10).Wait(); // 延遲10ms以模擬實際操作 } }); // 主線程等待任務完成 Console.ReadKey(); }
在這個示例中,我們創建了一個 ConcurrentQueue<int>
對象並啟動了兩個任務。一個任務向隊列中添加元素,另一個任務從隊列中取出元素。由於 ConcurrentQueue<T>
是線程安全的,所以這些操作可以在不同的線程上同時進行,而不需要擔心競爭條件。