C#之ConcurrentQueue

Queue<T>(队列)

在 C# 中,Queue 是一个先进先出(FIFO, First In First Out)数据结构,属于集合的一个类。
Queue 属于 System.Collections 或 System.Collections.Generic 命名空间,分别提供非泛型和泛型版本的实现。Queue 适用于需要按照入队顺序处理数据的场景。
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。

  • 适用于单线程环境。
  • 当确定不会有多个线程同时访问队列时。
  • 当需要高性能且不需要处理线程安全问题时。

ConcurrentQueue<T>

ConcurrentQueue<T>作为.NET Framework 4.0 引入的线程安全集合,采用无锁算法(Lock-Free),能显著提升高并发场景下的性能。它特别适合在多线程环境中使用,无需额外的锁机制即可安全地进行并发操作。

  • 适用于多线程环境。
  • 当需要多个线程同时安全地访问和操作队列时。
  • 当需要避免复杂的锁管理和潜在的死锁问题时。

基本概念

  • ConcurrentQueue<T> 是一个线程安全的先进先出(FIFO)队列,属于 System.Collections.Concurrent 命名空间。它遵循先进先出(FIFO)的原则,允许多个线程同时对队列进行操作,而无需额外的锁机制。
  • 用于在生产者和消费者场景中高效地处理数据。但需要注意的是,它并不保证元素在同一个线程内入队顺序和出队顺序完全一致。

基本用法

  • 创建 ConcurrentQueue
using System.Collections.Concurrent;

// 创建空的 ConcurrentQueue
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();

// 使用集合初始化器创建并初始化
ConcurrentQueue<string> namedQueue = new ConcurrentQueue<string>(new[] { "A", "B", "C" });
  • 入队操作 (Enqueue)
queue.Enqueue(1);  // 将元素添加到队列末尾
queue.Enqueue(2);
queue.Enqueue(3);
  • 出队操作 (TryDequeue)
if (queue.TryDequeue(out int result))
{
    Console.WriteLine($"Dequeued: {result}");
}
else
{
    Console.WriteLine("Queue is empty");
}
  • 查看队首元素 (TryPeek)
if (queue.TryPeek(out int peekResult))
{
    Console.WriteLine($"Peeked: {peekResult}");
}
  • 检查队列是否为空
bool isEmpty = queue.IsEmpty;

示例

    public partial class MainWindow : Window
    {

        private ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
        public MainWindow()
        {
            InitializeComponent();

            queue.Enqueue("1");
            queue.Enqueue("2");
            queue.Enqueue("3");
            var str = queue.First();
            Debug.Write($"======={str}");//1
            string? result;
            bool br = queue.TryDequeue(out result); // 尝试移除并返回队列开头的项目
            Debug.Write($"++++++++{result}");//1
            var str2 = queue.First();
            Debug.Write($"======={str2}");//2

        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C# 特殊集合 C#中的特殊集合主要有: 不可变的集合 并发的集合 位数组合位矢量 可观察的集合 不变的集合 如果...
    OctOcean阅读 1,091评论 0 1
  • 一、 Collection集合 Collection集合是专门用于数据存储和检索的类, 有两种主要的集合类型:泛型...
    三千阑干阅读 143评论 0 0
  • 基础 数组 (Array): 定义:一个固定大小的同类型元素的集合。 用途:当你需要存储一定数量的元素并且元素类型...
    墨韵轻语阅读 220评论 0 1
  • C#集合 有两种主要的集合类型:泛型集合和非泛型集合。 泛型集合被添加在 .NET Framework 2.0 中...
    OctOcean阅读 859评论 0 3
  • 1、进程 1)进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单...
    Crics阅读 493评论 0 0