队列是其元素按照先进先出(FIFO)的方式来处理的集合。
  队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现。在内部,Queue<T>类使用T类型的数组,这类似List<T>(http://www.cnblogs.com/afei-24/p/6824791.html)类型。队列实现ICollection和IEnumerable<T>接口,但没有实现ICollection<T>接口,所以ICollection<T>接口定义的Add()合Remove()方法不能用于队列。
  Enqueue()方法在队列的一端添加元素,Dequeue()方法在队列的另一端读取和删除元素。再次调用Dequeue(),会删除队列的下一个元素:

  Queue<T>类的方法和属性:

  在创建队列时,可以使用与List<T>类似的构造函数,也可以使用构造函数指定容量。
  非泛型Queue类的默认构造函数不同,它会创建一个包含32项的空数组

  下面用一个例子演示队列,使用一个线程将文档添加到队列中,用另一个线程从队列中读取文档,并处理:

      //存储在队列中的元素是Document类型
public class Document
{
public string Title { get; private set; }
public string Content { get; private set; } public Document(string title, string content)
{
this.Title = title;
this.Content = content;
}
} //DocumentManager类是Queue<Document>外面的一层。用来如何将文档添加到队列和从队列中获取文档
public class DocumentManager
{
private readonly Queue<Document> documentQueue = new Queue<Document>(); //因为多个线程访问DocumentManager类,所以用lock语句锁定对队列的访问 public void AddDocument(Document doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
} public Document GetDocument()
{
Document doc = null;
lock (this)
{
if (this.IsDocumentAvailable)
doc = documentQueue.Dequeue();
}
return doc;
} public bool IsDocumentAvailable
{
get
{
lock (this)
{
return documentQueue.Count > ;
} }
}
} //使用ProcessDocuments类在一个单独的任务中读取和删除队列中的文档。
public class ProcessDocuments
{
//能从外部访问的唯一方法是Start()方法
//在Start()中,实例化一个新任务。创建一个ProcessDocuments对象,调用ProcessDocuments的Run()方法
public static void Start(DocumentManager dm)
{
Task.Factory.StartNew(new ProcessDocuments(dm).Run);
} protected ProcessDocuments(DocumentManager dm)
{
if (dm == null)
throw new ArgumentNullException("dm");
documentManager = dm;
} private DocumentManager documentManager; //定义一个无限循环,使用DocumentManager类的IsDocumentAvailable属性确定队列中是否还有文档。
protected void Run()
{
while (true)
{
if (documentManager.IsDocumentAvailable)
{
Document doc = documentManager.GetDocument();
if(doc != null)
Console.WriteLine("Processing document {0}", doc.Title);
}
Thread.Sleep(new Random().Next());
}
}
}

客户端代码

      static void Main()
{
var dm = new DocumentManager(); ProcessDocuments.Start(dm);
ProcessDocuments.Start(dm);
// Create documents and add them to the DocumentManager
for (int i = ; i < ; i++)
{
Document doc = new Document("Doc " + i.ToString(), "content");
dm.AddDocument(doc);
Console.WriteLine("Added document {0}", doc.Title);
Thread.Sleep(new Random().Next());
} Console.ReadKey();
}

C#集合之队列的更多相关文章

  1. Java 集合与队列的插入、删除在并发下的性能比较

    这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对 ...

  2. .NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别

    数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,Ar ...

  3. Stack集合 Queue队列集合 Hashtable哈希表

    Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...

  4. Java集合--阻塞队列及各种实现的解析

    阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...

  5. C#泛型集合之——队列与堆栈

    队列与堆栈基础 队列 1.操作: (1)创建及初始化: Queue<类型> 队列名 =new Queue<类型>()://空队列,无元素 Queue<类型> 队列名 ...

  6. 消息队列MQ集合

    消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .

  7. C#学习总结之集合

    一.集合接口和类型 命名空间:  集合类型  命名空间  一般集合 System.Collections   泛型集合 System.Collections.Generic   特定类型集合 Syst ...

  8. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  9. 纸上谈兵:队列(queue)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 队列(queue)是一个简单而常见的数据结构.队列也是有序的元素集合.队列最大的特 ...

随机推荐

  1. java简单例子介绍IOC和AOP

    IOC和AOP的一些基本概念 介绍 IOC 一.什么是IOC IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内 ...

  2. CentOS/RedHat安装Python3

    CentOS/RedHat安装Python3 摘自:https://blog.csdn.net/mvpboss1004/article/details/79377019 CentOS/RedHat默认 ...

  3. linux查看操作系统版本信息

    linux查看操作系统版本信息  摘自:https://www.cnblogs.com/vaelailai/p/7545166.html 一.linux下如何查看已安装的centos版本信息: 1.L ...

  4. Oracle RMAN-06023 和ORA-19693错误

    在将一个0级备份的数据库还原到其它机器上时,首先遇到了RMAN-06023然后遇到ORA-19693错误,错误发生的环境和内容大致如下: 数据库版本: SQL> select * from v$ ...

  5. HaXe以及OpenFL部署

    HaXe以及OpenFL部署 Haxe是一种跨平台的编程语言,本文并未HAXE的教程,只是针对OPENFL以及HAXE的部署教程.HAXE的语法非常类似AS3,由于国内部署HAXE艰难,经常下载到一半 ...

  6. HDU 4126 Genghis Khan the Conqueror (树形DP+MST)

    题意:给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边 (可以经过可疑边新的花费构建的边),注意每次只出现一条可疑的边,n个 ...

  7. Maven打包jar项目

    默认情况下,使用maven打包的jar项目(执行maven install)不会包含其他包引用,要想打包为带其他项目引用的jar,需要加入插件 要得到一个可以直接在命令行通过java命令运行的JAR文 ...

  8. linux安装memcache及memcache扩展

    一.安装libevent# wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz# tar zxf libevent-2.0 ...

  9. [LeetCode 题解]: Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  10. C#中使用Redis学习一 windows安装redis服务器端和客户端

    学习背景 今天是2015年1月2日,新年刚开始的第二天,先祝大家元旦快乐啦(迟到的祝福吧^_^).前段时间一直写Jquery插件开发系列博文,这个系列文章暂停一段时间,最近一直在看redis,我将把r ...