C# 队列 Queue

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对象中
启动任务时,会在队列中添加和删除文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值