using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Net; using System.Text.RegularExpressions; namespace ThreadTest { public class console { static void Main() { ThreadTest foo = new ThreadTest(); try { foo.run(); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("Ended"); Console.Read(); } } public class ThreadTest { private Queue queue = new Queue(); public static int threadCount = 0; public ThreadTest() { this.queue.Enqueue(new Uri("http://www.hoffie.info")); this.queue.Enqueue(new Uri("http://www.dmoz.org/")); } public void run() { System.Uri u; while (queue.Count > 0) { u = queue.Dequeue(); UriWorker w = new UriWorker(u, this.queue); ThreadPool.QueueUserWorkItem(new WaitCallback(w.process)); } if (queue.Count > 0 || !Interlocked.Equals(ThreadTest.threadCount, 0)) { System.Threading.Thread.Sleep(5000); Console.WriteLine("Sleeped for 5s"); this.run(); } } } public class UriWorker { private WebClient web = new WebClient(); private Uri uri; private Queue queue; private string reply; public UriWorker(Uri u, Queue q) { Console.WriteLine("Constructing: " + u); this.uri = u; this.queue = q; Interlocked.Increment(ref ThreadTest.threadCount); } public void process(Object stateInfo) { try { this.processUri(); this.processResponse(); Console.WriteLine("Processed: " + this.uri); } catch (WebException e) { Console.WriteLine("WebException: " + e.Message); } finally { Interlocked.Decrement(ref ThreadTest.threadCount); } } private void processUri() { Console.WriteLine("Processing: " + this.uri); this.reply = this.web.DownloadString(this.uri); } private void processResponse() { Uri match; string pattern = @"href=""(http://(.*?))"""; foreach (Match m in Regex.Matches(reply, pattern)) { GroupCollection groups = m.Groups; try { match = new Uri(groups[1].ToString()); } catch (System.UriFormatException e) { Console.WriteLine("UriFormatException" + e.Message); continue; } this.queue.Enqueue(match); } } } }