using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace QueueTest
{
    class DocumentManager
    {
        private readonly Queue<Docoument> documentqueue = new Queue<Docoument>();
        public void AddDocument(Docoument doc)
        {
            lock (this)
            {
                documentqueue.Enqueue(doc);
            }
        }
        public Docoument GetDocument()
        {
            Docoument doc = null;
            lock (this)
            {
                documentqueue.Dequeue();
            }
            return doc;
        }
        public bool IsDocumentVarialable
        {            get
            {
                return documentqueue.Count > 0;
            }
        }
    }
    class Docoument
    {
        private string title;
        private string content;
        public string Tiltle
        {
            get { return title; }
        }
        public string Content
        {
            get { return content; }
        }
        public Docoument(string title, string content)
        {
            this.content = content;
            this.title = title;
        }
    }
    class ProcessDocument
    {
        public static void Start(DocumentManager dm)
        {
            new Thread(new ProcessDocument(dm).Run).Start();
        }
        private DocumentManager documentManager;
        protected ProcessDocument(DocumentManager dm)
        {
            documentManager = dm;
        }
        protected void Run()
        {
            while (true)
            {
                if (documentManager.IsDocumentVarialable)
                {
                    Docoument doc = documentManager.GetDocument();
                    Console.WriteLine("Processing document{0}", doc.Tiltle);
                }
                else
                {
                    return;
                }
                Thread.Sleep(new Random().Next(20));
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            DocumentManager dm = new DocumentManager();
            ProcessDocument.Start(dm);
            for (int i = 0; i < 1000; i++)
            {
                Docoument doc = new Docoument("Doc" + i.ToString(), "content");
                dm.AddDocument(doc);
                Console.WriteLine("added document{0}", doc.Tiltle);
                Thread.Sleep(new Random().Next(20));
            }
        }
    }
}

解决方案 »

  1.   

    没仔细看。不过空引用嘛,就一步一步跟下去,看看哪一行报错,报错行的对象、方法的参数之类的,看看有没有为空的就行了呗。简单看了一下,不知道对不对
                    public   Docoument   GetDocument() 
                    { 
                            Docoument   doc   =   null; 
                            lock   (this) 
                            { 
                                    documentqueue.Dequeue(); 
                            } 
                            return   doc; 
                    } 
    没用过那个Dequeue()的方法,不知道它在干什么。但是,这个Get方法返回的好象只是个空值而不是你想要的Document吧。