[转]C#==>多线程的文档列队模型

通常处理各种这几种任务,比如排队系统,打印列队,处理请求都需要用使用到列队FIFO,即先进先出

 

下面这个类子模拟了在多线程环境下的对文档的操作,这里打印文档的标题,现实中还可以对文档进行各种处理

 

1,文档类

    /// <summary>
    ///    文档类,包含标题和内容两个属性
    /// </summary>
    public class Document
    {
        private string title;
        public string Title
        {
            get { return title; }
        }

        private string content;
        public string Content
        {
            get { return content; }
        }

        public Document(string title, string content)
        {
            this.title = title;
            this.content = content;
        }

    }

2,文档列队管理

    /// <summary>
    /// 文档列队管理
    /// </summary>
    public class DocumentManager
    {
        private readonly Queue<Document> docQueue = new Queue<Document>();

        //向列队中添加文档
        public void AddDoc(Document doc)
        {
            lock (this)
            {
                docQueue.Enqueue(doc);
            }
        }
        //从列队中取得文档
        public Document GetDocument()
        {
            Document doc = null;

            lock (this)
            {
                doc = docQueue.Dequeue();
            }

            return doc;
        }

        //判断列队中时候存在文档
        public bool IsDocAcailable
        {
            get { return docQueue.Count > 0; }
        }

    }

3,实现文档列队的线程控制

    /// <summary>
    /// 文档列队的线程控制
    /// </summary>
    class ProcessDocuments
    {
        public static void Start(DocumentManager dm)
        {
            //开启新进程,向Thread委托Run()方法
            new Thread(new ProcessDocuments(dm).Run).Start();
        }

        protected ProcessDocuments(DocumentManager dm)
        {
            documentManager = dm;
        }

        private DocumentManager documentManager;

        protected void Run()
        {
            while (true)
            {
                if (documentManager.IsDocAcailable)
                {
                    //如果列队中有文档就读取
                    Document doc = documentManager.GetDocument();
                    Console.WriteLine("Process documnet {0}", doc.Title);
                }
                Thread.Sleep(new Random().Next(20));
            }
        }
    }

4,使用

        static void Main(string[] args)
        {
            DocumentManager dm = new DocumentManager();
            //开启线程,开始监控列队
            ProcessDocuments.Start(dm);

            //每隔1秒钟向列队加入文档
            for (int i = 0; i < 100; i++)
            {
                Document doc = new Document("文档 " + i.ToString(), "Content");
                dm.AddDoc(doc);
                Console.WriteLine("向列队中添加文档 {0}", doc.Title);
                //一秒后再添加下一个
                Thread.Sleep(1000);
            }
        }

 

posted @ 2014-10-31 14:40  Net-Spider  阅读(235)  评论(0)    收藏  举报