c#Queue队列的使用

消息队列

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

Queue的方法
方法名 注释
Void Clear()  从 Queue 中移除所有对象。
 Bool Contains(object obj)  确定某元素是否在 Queue 中。
 Object Clone()  创建 Queue 的浅表副本。
 Void CopyTo(Array array,int index)  从指定数组索引开始将 Queue 元素复制到现有一维 Array 中。
 Object Dequeue()  移除并返回位于 Queue 开始处的对象。
 Void Enqueue(object obj)  将对象添加到 Queue 的结尾处。
 Object Peek()  返回位于 Queue 开始处的对象但不将其移除。
 Object[] ToArray()  将 Queue 元素复制到新数组。
 Void TrimToSize()  将容量设置为 Queue 中元素的实际数目。

示例代码:


class
Program { //定义一个消息队列 static Queue<string> qs = new Queue<string>(); static System.Threading.Timer timer; //处理消息队列中的数据 private static void toDoData(object state) { List<string> qsList = new List<string>(); if (qs.Count > 0) { while (true) { string item = null; try { //根据先进先出的原则,移除队列中的数据
               //如果在调用Dequeue()方法时,队列中不再有元素,就抛出一个InvalidOperationException类型的异常。所以需要try-catch捕获异常
item = qs.Dequeue(); } catch { } if (item != null) { qsList.Add(item); } else { break; } } //打印出每次处理的数据 string doResultStr = string.Join(",", qsList); Console.WriteLine(doResultStr+ " "); if (doResultStr.Contains("101")) { //Timeout.Infinite极大的,把计时器的间隔执行时间设为无穷大,相当于将计时器给暂用了。 timer.Change(1,Timeout.Infinite); } } } static void Main(string[] args) { //每隔一秒执行移除队列 timer = new Timer(toDoData, null, 1000, 1000); ProductData(); Console.ReadKey(); } //模拟不断返回的数据(现在面临回调函数不断返回数据) private static void ProductData() { for (int i = 0; i < 10000; i++) { Thread.Sleep(200); //添加数据到队列的末端 qs.Enqueue(string.Format("这是第{0}条数据",i)); } } }

Dequeue方法执行前:队列包含第22条数据

Dequeue方法执行后:队列移除了第22条数据

item是被移除的数据,开发人员方便对它进行操作

执行结果如下:

原文地址:https://www.cnblogs.com/likui-bookHouse/p/10981272.html