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

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

 

posted on 2011-12-19 15:24  cknife  阅读(302)  评论(0)    收藏  举报

导航