创建定制的泛型类--泛型Queue多线程读写文档--的泛型方法

来源:互联网 发布:淘宝的数字暗语大全 编辑:程序博客网 时间:2024/04/30 09:14
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading;
  5. namespace Generic_T_Manager
  6. {
  7.   public interface IDocument
  8.   {
  9.     string Title
  10.     { get;}
  11.     string Content
  12.     { get;}
  13.   }
  14.   public class Document : IDocument
  15.   {
  16.     private string title;
  17.     public string Title
  18.     {
  19.       get { return title; }
  20.     }
  21.     private string content;
  22.     public string Content
  23.     {
  24.       get { return content; }
  25.     }
  26.     public Document(string title, string content)
  27.     {
  28.       this.title = title;
  29.       this.content = content;
  30.     }
  31.   }
  32.   public interface IDocumentManager<T>
  33.   {
  34.     void AddDocument(T doc);
  35.     T GetDocument();
  36.     bool IsDocumentAvailable
  37.     { get;}
  38.   }
  39.   public class DocumentManager<T> : IDocumentManager<T>
  40.   {
  41.     Queue<T> documentQueue = new Queue<T>();
  42.     public void AddDocument(T doc)
  43.     {
  44.       lock (this)
  45.       {
  46.         documentQueue.Enqueue(doc);
  47.       }
  48.     }
  49.     public T GetDocument()
  50.     {
  51.       T doc;
  52.       lock (this)
  53.       {
  54.         doc = documentQueue.Dequeue();
  55.       }
  56.       return doc;
  57.     }
  58.     public bool IsDocumentAvailable
  59.     {
  60.       get { return documentQueue.Count > 0 ? true : false; }
  61.     }
  62.   }
  63.   //where子句要求泛型类实现一个接口,或派生与某个基类。
  64.   
  65.   //ProcessDocument 独立于Document具体类和DocumentManager具体类
  66.   //是通过定义IDocument和IDocumentManager<T>接口来实现的。
  67.   //ProcessDocument 改为使用两个泛型类TDocument和TDocumentManager。
  68.   //第一个where子句指定TDocument类型必须实现IDocument接口。
  69.   //可以用于TDocument的一种类型是Document具体类,因为这个类实现了IDocument接口。
  70.   //但是,实现了IDocument接口的其它类也可以用于TDocument。
  71.   //TDocumentMananger类型的where子句指定,这个类型必须实现IDocumentManager<TDocument>接口。
  72.   //所以在Document用于TDocument时,TDocumentManager必须是一个实现IDocumentMan<Document>的类。
  73.   public class ProcessDocument<TDocument, TDocumentManager>
  74.     where TDocument:IDocument
  75.     where TDocumentManager:IDocumentManager<TDocument>
  76.   {
  77.     private TDocumentManager documentManager;
  78.     protected ProcessDocument(TDocumentManager dm)
  79.     {
  80.       documentManager = dm;
  81.     }
  82.     protected void Run()
  83.     {
  84.       while (true)
  85.       {
  86.         if (documentManager.IsDocumentAvailable)
  87.         {
  88.           TDocument doc = documentManager.GetDocument();
  89.           Console.WriteLine("Processing document {0}", doc.Title);
  90.         }
  91.         else
  92.           break;
  93.         Thread.Sleep(20);
  94.       }
  95.     }
  96.     public static void Start(TDocumentManager dm)
  97.     {
  98.       new Thread(new ProcessDocument<TDocument, TDocumentManager>(dm).Run).Start(); 
  99.     }    
  100.   }
  101.   
  102.   class Program
  103.   {
  104.     static void Main(string[] args)
  105.     {
  106.       DocumentManager<Document> dm = new DocumentManager<Document>();
  107.       ProcessDocument<Document, DocumentManager<Document>>.Start(dm);
  108.       for (int i = 0; i < 200; i++)
  109.       {
  110.         Document d1 = new Document("title" + i.ToString(), "content");
  111.         dm.AddDocument(d1);
  112.         Console.WriteLine("added docuemnt {0}", d1.Title);
  113.         Thread.Sleep(10);
  114.       }
  115.     }
  116.   }
  117. }
原创粉丝点击