线程池跟自定义事件的应用例子 - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 线程池跟自定义事件的应用例子 (http://www.webasp.net/article/5/4220.htm) |
| -- 作者:未知 -- 发布日期: 2003-07-12 |
| using System; using System.Threading; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.IO; namespace ThreadPoolDelegate { //public delegate void ReceiveCompletedEventHandler(string url,string title,string sourcecode); public delegate void ReceiveCompletedEventHandler(object sender,ReceiveCompletedEventArgs e); /// <summary> /// Class1 的摘要说明。 /// </summary> public class Class1 { public event ReceiveCompletedEventHandler ReceiveCompletedEvent; public Class1() { // // TODO: 在此处添加构造函数逻辑 // } public void ReadSourceCode(object o) { string url = (string)o; string title = ""; string sourcecode = ""; WebClient wc = new WebClient(); byte[] data = wc.DownloadData(url); sourcecode = Encoding.Default.GetString(data); title = this.GetPageTitle(sourcecode); if (ReceiveCompletedEvent != null) { //ReceiveCompletedEvent(url,title,sourcecode); ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode)); } } public void ReadSourceCode(object o,bool timeout) { string url = (string)o; string title = ""; string sourcecode = ""; WebClient wc = new WebClient(); byte[] data = wc.DownloadData(url); sourcecode = Encoding.Default.GetString(data); title = this.GetPageTitle(sourcecode); if (ReceiveCompletedEvent != null) { //ReceiveCompletedEvent(url,title,sourcecode); ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode)); } } private string GetPageTitle(string str) { string lTitle = ""; string lPattern = "(?:<\\s*title\\s*>(?<t>[^<]+))"; Regex rx = new Regex(lPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled ); Match mt = rx.Match(str); if ( mt.Success ) try { lTitle = mt.Groups["t"].Value.ToString(); } catch { lTitle =""; } else lTitle = ""; return lTitle; } } public class test { static ManualResetEvent ev = new ManualResetEvent(false); private static int intCount; private static DateTime dtStart = DateTime.Now; public static void Main(string[] args) { Class1 c = new Class1(); c.ReceiveCompletedEvent += new ReceiveCompletedEventHandler(WriteOut); if (args.Length >=1) { for (int i=0;i<args.Length;i++) { //ThreadPool.QueueUserWorkItem(new WaitCallback(c.ReadSourceCode),args[i]); ThreadPool.RegisterWaitForSingleObject(ev,new WaitOrTimerCallback(c.ReadSourceCode),args[i],3000,true); intCount++; } ev.WaitOne(); } else { Console.WriteLine("you must pass an argument at least "); } } private static void WriteOut(object sender,ReceiveCompletedEventArgs e) { try { intCount--; Console.WriteLine("正在执行......{0}",e.URL); FileStream fs = new FileStream(@"c:\"+e.Title+".txt",FileMode.Create,FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(e.URL); sw.WriteLine(); sw.WriteLine(e.Title); sw.WriteLine(); sw.WriteLine(e.SourceCode); sw.WriteLine(); sw.Flush(); fs.Flush(); sw.Close(); fs.Close(); Console.WriteLine("执行完成......{0}",e.URL); if(intCount == 0) { Console.WriteLine("程序执行完成....."); TimeSpan tsSpent = DateTime.Now.Subtract(dtStart); Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds); Console.WriteLine("程序在退出之前等待5秒,only for demo"); Thread.Sleep(5000); ev.Set(); } } catch(Exception ex) { throw new Exception(ex.Message); } } /* private static void WriteOut(string url,string title,string sourcecode) { intCount--; FileStream fs = new FileStream(@"c:\"+title+".txt",FileMode.Create,FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(url); sw.WriteLine(); sw.WriteLine(title); sw.WriteLine(); sw.WriteLine(sourcecode); sw.WriteLine(); sw.Flush(); fs.Flush(); sw.Close(); fs.Close(); Console.WriteLine("执行完成......{0}",e.URL); if(intCount == 0) { Console.WriteLine("程序执行完成....."); TimeSpan tsSpent = DateTime.Now.Subtract(dtStart); Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds); Console.WriteLine("程序在退出之前等待10秒,only for demo"); Thread.Sleep(10000); ev.Set(); } } */ } public class ReceiveCompletedEventArgs : System.EventArgs { string _url; string _title; string _sourcecode; public string URL { get { return _url; } } public string Title { get { return _title; } } public string SourceCode { get { return _sourcecode; } } public ReceiveCompletedEventArgs(string url,string title,string sourcecode) { this._url = url; this._title = title; this._sourcecode = sourcecode; } } } 这里定义了两种委托的方式,大家随便看看 |
| webasp.net |