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