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);
///
/// Class1 的摘要说明。
///
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*>(?
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 { //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; } } } 这里定义了两种委托的方式,大家随便看看

