队列是其元素按照先进先出(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. [Jenkins] Jenkins 执行 Composite 模式的 SoapUI Project

    cd %WORKSPACE% cmd /c call "D:\Program Files\SmartBear\ReadyAPI-1.3.1\bin\testrunner.bat" ...

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

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

  3. LWIP数据包管理

  4. [GO]百度贴吧的爬虫

    package main import ( "fmt" "strconv" "net/http" "os" " ...

  5. CodeForces 690D1 The Wall (easy) (判断连通块的数量)

    题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...

  6. 两个SSH2间免密码登录

    SSH2免密码登录OpenSSHhttp://blog.csdn.net/aquester/article/details/23836299 OpenSSH免密码登录SSH2http://blog.c ...

  7. 我的CSS3学习笔记

    1.元字符使用: []: 全部可选项 ||:并列 |:多选一 ?: 0个或者一个 *:0个或者多个 {}: 范围 2.CSS3属性选择器: E[attr]:存在attr属性即可: E[attr=val ...

  8. 上下文——webApplicationContext 与servletContext

    1.WebApplicationContext的研究 ApplicationContext是spring的核心,Context通常解释为上下文环境,用“容器”来表述更容易理解一些,Applicatio ...

  9. ArrayList动态数组System.Collections命名空间下

    using System.Collections; namespace myspace { class myclass { ArrayList myList=new ArrayList(); } }

  10. django That port is already in use

    python 直接在命令行里启动,如果取消运行,可能会报错,解决方法如下 ps aux | grep -i manage 找出manage.py 对应的pid号码 第二步删除对应的进程 kill -9 ...