Document class:
classDocument { Public stringTitle {Get;Private Set; } Public stringContent {Get;Private Set; } PublicDocument (stringTitlestringcontent) { This. Title =title; This. Content =content; } }
Documentmanager class:
classDocumentmanager {Private ReadOnlyQueue<document> Documentqueue =NewQueue<document>(); Public BOOLisavailable {Get{returnDocumentqueue.count >0; } } Public voidadddocument (Document doc) {Lock( This) {documentqueue.enqueue (doc); } } PublicDocument GetDocument () {Document Doc=NULL; Lock( This) {Doc=Documentqueue.dequeue (); } returnDoc; } }
Processdocuments class:
classprocessdocuments {PrivateDocumentmanager DM; protectedprocessdocuments (Documentmanager DM) { This. DM =DM; } protected voidRun () { while(true) { if(DM. isavailable) {Document doc=DM. GetDocument (); Console.WriteLine ("processing document {0}", Doc. Title); } thread.sleep (NewRandom (). Next ( -)); } } Public Static voidStart (Documentmanager DM) {NewThread (Newprocessdocuments (DM). Run). Start (); } }
Application layer:
classProgram {Static voidMain (string[] args) { varDM =NewDocumentmanager (); Processdocuments.start (DM); for(inti =0; I < -; i++) {Document doc=NewDocument ("Doc"+ i.tostring (),"content"); Dm. Adddocument (DOC); Console.WriteLine ("Added Document {0}", Doc. Title); Thread.Sleep (NewRandom (). Next ( -)); } console.readline (); } }
Use of queue queues