C# 队列 Queue

来源:互联网 发布:asp sql 仓库管理系统 编辑:程序博客网 时间:2024/06/08 15:22

queue队列:先进先出

Queue类的成员说明

Count队列中元素的个数

Enqueue队列的一端添加一个元素

Dequeue在队里饿的头部读取和删除一个元素(如果没有元素时调用.会排出异常)

Peek从队里饿的头部读取一个元素,但不删除它

TrimExcess重新设置队列的容量.

文档类 文档处理类

 public class Document    {        public string Title { get; set; }        public string Content { get; set; }        public Document(string title,string content)        {            this.Title = title;            this.Content = content;        }    }    public class DocumentManager    {        private readonly Queue<Document> documentQueue = new Queue<Document>();        public void AddDocument(Document doc)        {            lock (this)            {                documentQueue.Enqueue(doc);            }        }        public Document GetDocument()        {            Document doc = null;            lock (this)            {                doc = documentQueue.Dequeue();            }            return doc;        }        public bool IsDocumentAvailable        {            get            {                return documentQueue.Count > 0;            }        }    }    public class ProcessDocuments    {        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;        protected void Run()        {            while (true)            {                if (documentManager.IsDocumentAvailable)                {                    Document doc = documentManager.GetDocument();                    Console.WriteLine("Processing document {0}",doc.Title);                }                Thread.Sleep(new Random().Next(2000));            }        }    }

Main()

 static void Main(string[] args)        {            var dm = new DocumentManager();            ProcessDocuments.Start(dm);            for (int i = 0; i < 20; i++)            {                var doc = new Document("Doc"+i.ToString(),"Content");                dm.AddDocument(doc);                Console.WriteLine("Added document {0}",doc.Title);                Thread.Sleep(new Random().Next(4000));            }            Console.ReadKey();        }

DocumentManager:处理文档,addDocument,getDocument

ProcessDocument类,一个单独的任务重处理队列中的文档.外部访问的唯一方法Start().方法中实例化一个新任务,创建一个ProcessDocument对象.定义Run()方法作为任务的启动方法.
TaskFactory的StartNew方法需要一个Action委托作为参数.勇于接受Run方法传递的地址.
Run()定义了一个无限循环,先用IsDOucmentAvailable判断队列中是否有文档.悠久从DocumentManager中提取文档并处理(写入文件,数据库,发送等操作).

在Main()方法中.实例化了一个DocumentManager对象.启动文档处理任务,创建文档并添加到DocumentManager对象中
启动任务时,会在队列中添加和删除文档

原创粉丝点击