[转]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); } }
浙公网安备 33010602011771号