c#Queue队列的使用
消息队列
队列(System.Collections.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+ "\n"); 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是被移除的数据,开发人员方便对它进行操作
执行结果如下: