聚热点 juredian

c# Queue 队列的基本使用

C# 中的 Queue 是一种基于链表的先进先出 (FIFO) 数据结构。以下是一个简单的 Queue 实例:

///

/// 普通队列

///

public void QueueShow()

{

// 创建一个Queue

Queue queue = new Queue();

// 添加元素到队列中

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 是 .NET 中一个非常有用的类,它用于在多线程环境中安全地处理队列。下面是一个 ConcurrentQueue 的基本示例:

///

/// 线程安全队列

///

public void ConcurrentQueueShow()

{

// 创建一个ConcurrentQueue

ConcurrentQueue queue = new ConcurrentQueue();

// 添加元素到队列中

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的情况。

///

/// 线程安全队列

/// 如果多个线程同时操作一个队列推荐使用安全队列,因为有可能引起添加队列前数据都是正常的,当出队时数据是null的情况。

///

public void ConcurrentQueueShow2()

{

// 创建一个 ConcurrentQueue 实例

ConcurrentQueue queue = new ConcurrentQueue();

// 启动一个任务来向队列中添加元素

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 对象并启动了两个任务。一个任务向队列中添加元素,另一个任务从队列中取出元素。由于 ConcurrentQueue 是线程安全的,所以这些操作可以在不同的线程上同时进行,而不需要担心竞争条件。

本站资源来自互联网,仅供学习,如有侵权,请通知删除,敬请谅解!
搜索建议:c#  c#词条  队列  队列词条  基本  基本词条  使用  使用词条  Queue  Queue词条  
热博

 男人极致的帅,能帅到什么程度?

那必须是严屹宽啊,什么叫剑眉星目,什么叫目若朗星,看看他就知道了。五官深邃,轮廓分明,给人一种贵族公子般的感觉。侧面线条真的绝了,宛若刀削斧凿一般。简直是西装杀...(展开)